-
[백준] 14395 4연산ALGORITHM/BOJ 2020. 11. 22. 23:06
2020-11-22
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485import java.util.HashSet;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;class Temp {long num;String str;public Temp(long num, String str) {this.num = num;this.str = str;}}public class Main14395 {public static long S, T;public static String answer;public static Queue<Temp> q;public static HashSet<Long> set;public static void solve() {set = new HashSet<>();loop:while(!q.isEmpty()) {Temp tmp = q.poll();long num = tmp.num;String str = tmp.str;for(int i = 0; i < 4; i++) {long nx = 0;String nstr = "";switch(i) {case 0: // *nx = num * num;nstr = str + "*";break;case 1: // +nx = num + num;nstr = str + "+";break;case 2: // -nx = num - num;nstr = str + "-";break;case 3: // /if(num != 0) {nx = num / num;nstr = str + "/";if(!set.contains(nx)) {set.add(nx);q.add(new Temp(nx, nstr));}}break;}if(i != 3 && !set.contains(nx)) {set.add(nx);q.add(new Temp(nx, nstr));}if(nx == T) {answer = nstr;break loop;}}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);S = sc.nextLong();T = sc.nextLong();answer = "";if(S == T) answer = "0";else {q = new LinkedList<Temp>();q.add(new Temp(S, ""));solve();}if(answer == "") System.out.println("-1");else System.out.println(answer);}}cs 1. S와 T가 같은 경우 바로 답을 출력하고 그런 경우가 아니라면 탐색을 시작한다. queue에 long S와 String 빈 값을 갖고 시작했다.
2. queue에 들어간 값을 빼면서 각각 *, +, -, / 순서로 값을 계산해본다. 이 순서로 계산을 한 이유는 가능한 방법이 여러 가지라면, 사전 순으로 앞서는 것을 출력한다. 라는 문구가 있었기 때문이다. 애초에 연산자 아스키 코드 순서대로 계산을 하면 나중에 후처리를 할 피요가 없다.
3. 계산을 하면서 한 번도 도출해본적이 없는 결과값이면 HashSet에 저장하고 queue에 저장을 하였다.
10^9이기 때문에 O(1000000000)로 시간초과가 날 수 밖에 없다. 그래서 HashSet을 사용하여 중복을 제거 해줬다.
'ALGORITHM > BOJ' 카테고리의 다른 글
[백준] 1747 소수&팰린드롬 (0) 2020.11.27 [백준] 1966 프린터 큐 (0) 2020.11.24 [백준] 1167 트리의 지름 (0) 2020.11.22 [백준] 11722 가장 긴 감소하는 부분 수열 (0) 2020.11.22 [백준] 15662 톱니바퀴 (2) (+14891 톱니바퀴) (0) 2020.11.21