ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 14395 4연산
    ALGORITHM/BOJ 2020. 11. 22. 23:06

    www.acmicpc.net/problem/14395

     

    14395번: 4연산

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

    www.acmicpc.net

    2020-11-22


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    import 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을 사용하여 중복을 제거 해줬다.

    댓글

Programming Diary