본문 바로가기

알고리즘/백준

16953 - A -> B[S2]

목차

    문제

    정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.

    • 2를 곱한다.
    • 1을 수의 가장 오른쪽에 추가한다. 

    A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.

    풀이

     

    BFS의 기본 변형 같은 문제.

    두 가지의 경우의 수를 반복해서 탐색하면 된다. 이를 위해 PriorityQueue를 선언 후, Comparator로 최대값을 먼저 순회하도록 설정하였다.

     

    그 외에 Long 타입 int 캐스팅 시 long 원시형으로 변형 후 두 번 변형해야 한다는 점 유의할 것.

    코드

     

    
    import java.io.*;
    import java.util.*;
    
    public class Main {
        static long N, M;
        static int result = -1;
        public static void main(String[] args) throws Exception {
            input();
            if(N == M) {
                System.out.println(1);
                return;
            }
    
            PriorityQueue<Long[]> pq = new PriorityQueue<>((l1, l2) -> -l1[0].compareTo(l2[0]));
            pq.add(new Long[] {(N * 2), 2L});
            pq.add(new Long[] {(N * 10 + 1), 2L});
            while(!pq.isEmpty()) {
                Long[] now = pq.poll();
                long value = now[0];
                int count = (int) (long) now[1];
                if(value == M) {
                    result = count;
                    break;
                }
                if(value < M) {
                    pq.add(new Long[] {(value * 2), (long)(count + 1)});
                    pq.add(new Long[] {(value * 10 + 1), (long)(count + 1)});
                }
            }
    
            if(result != -1) System.out.println(result);
            else System.out.println(-1);
    }
    
    static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Long.parseLong(st.nextToken());
        M = Long.parseLong(st.nextToken());
    }
    }

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

    1520 - 내리막길[G3]  (0) 2024.05.21
    1932 - 정수 삼각형[S1]  (0) 2024.05.09
    2629 - 양팔저울[G3]  (0) 2024.05.04
    15683 - 감시[G4]  (0) 2024.04.12
    5972 - 택배 배송(G5)  (0) 2024.03.30