어흥

[백준 14395] 4연산 (Java) 본문

알고리즘/백준

[백준 14395] 4연산 (Java)

라이언납시오 2021. 4. 2. 19:29
728x90
반응형

문제 링크: www.acmicpc.net/problem/14395

 

14395번: 4연산

첫째 줄에 정수 s를 t로 바꾸는 방법을 출력한다. s와 t가 같은 경우에는 0을, 바꿀 수 없는 경우에는 -1을 출력한다. 가능한 방법이 여러 가지라면, 사전 순으로 앞서는 것을 출력한다.  연산의 아

www.acmicpc.net

1. 주의할 점

- 출력에 있어 3가지의 경우가 있다

- 정답이 여러개인 경우, 사전순으로 앞선 경우를 출력한다

 

2. 구현

- BFS를 통해 정답을 도출한다

- 최대 범위가 10^9이므로 곱셈 혹은 덧셈의 결과가 10^9를 넘기지 않도록 한다

- 사전순으로 빠른 순서대로 BFS 탐색을 시작하며, 연산 결과의 숫자가 존재하지 않는 경우, Set과 큐에 추가한다

- 큐에서 꺼낸 원소가 Target과 같다면 Finish를 True로 전환 및 as에 cs를 할당하고 BFS를 종료한다

- Finish가 false면 -1을, true면 as의 값에 따라 답을 출력한다

 

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    static HashSet<Integer> hs;
    
    static class Info {
        int val;
        String str="";
        public Info(int val, String str){
            this.val = val;
            this.str = str;
        }
    };
    
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    String ss = br.readLine();
        StringTokenizer st = new StringTokenizer(ss);
    	int start = Integer.parseInt(st.nextToken());
    	int target = Integer.parseInt(st.nextToken());
    	int mulMax = 34000, maxi=1000000000;
        //초기화
        hs = new HashSet<>();
        Queue<Info> q = new LinkedList<>();
        q.offer(new Info(start,""));
        String as="";
        boolean finish=false;
        
        while(!q.isEmpty()){
            Info ii = q.poll();
            int cv = ii.val;
            String cs = ii.str;
            if(cv==target){
                as = cs;
                finish=true;
                continue;
            }
            if(as.length()!=0 && as.length()<=cs.length()) continue;
            if(!hs.contains(0)){
                hs.add(0);
                q.offer(new Info(0,cs+"-"));
            }
            if(cv<=mulMax && !hs.contains(cv*cv)){
                q.offer(new Info(cv*cv,cs+"*"));
                hs.add(cv*cv);
            }
            if(cv+cv<=maxi && !hs.contains(cv+cv)){
                q.offer(new Info(cv+cv,cs+"+"));
                hs.add(cv+cv);
            }
            if(cv!=0 && !hs.contains(cv/cv)){
                q.offer(new Info(cv/cv,cs+"/"));
                hs.add(cv/cv);
            }
        }
        if(!finish) System.out.print(-1);
        else System.out.print(as.equals("")? 0 : as);
	}
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 6059] Pasture Walking (C++)  (0) 2021.04.02
[백준 2479] 경로 찾기 (Java)  (0) 2021.04.02
[백준 4803] 트리 (Java)  (0) 2021.04.02
[백준 3584] 가장 가까운 공통 조상 (Java)  (0) 2021.04.01
[백준 14867] 물통 (Java)  (0) 2021.04.01
Comments