Light Blue Pointer
본문 바로가기
Coding Test

[백준] A → B

by Greedy 2024. 4. 16.

문제 주소

https://www.acmicpc.net/problem/16953

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

문제 설명

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

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

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

입력

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

출력

A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.

예제 입력 1

2 162

예제 출력 1

5

2 → 4 → 8 → 81 → 162

예제 입력 2

4 42

예제 출력 2

-1

예제 입력 3

100 40021

예제 출력 3

5

100 → 200 → 2001 → 4002 → 40021

 

제출 코드

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

public class Main {

    static long min = Long.MAX_VALUE;
    static long target;

    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        long n = Integer.parseInt(st.nextToken());
        target = Integer.parseInt(st.nextToken());

        search(n);

        if(min==Long.MAX_VALUE){
            min = -1;
        }

        System.out.println(min);

    }

    public static void search(long n){
        int count = 0;

        ArrayList<Long> list = new ArrayList<>();
        ArrayList<Long> next;

        list.add(n);

        while(!list.isEmpty()){

            count++;
            next = new ArrayList<>();

            for(long i : list){
                if(i>target){
                    continue;
                }else if(i==target){
                    min = count;
                    return;
                }
                next.add(i*10+1);
                next.add(i*2);
            }

            list = next;
        }
    }
}

코드 설명

search 함수에서 BFS를 돌린다

i가 target보다 크면 더 할 필요가 없으므로 continue로 넘기고

i가 target과 같으면 전역변수에 넣어주고 리턴한다

그 외의 경우에는 1을 붙인 값과 2를 곱한 값을 next에 넣어준다

q의 모든 자식노드가 next에 들어있는데

next를 q에 넣어서 다음 level을 search하게 한다

 

풀이과정

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

public class Main {

    static int min = Integer.MAX_VALUE;
    static int target;

    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        target = Integer.parseInt(st.nextToken());

        search(n);

        if(min==Integer.MAX_VALUE){
            min = -1;
        }

        System.out.println(min);

    }

    public static void search(int n){
        int count = 0;

        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> next;

        list.add(n);

        while(!list.isEmpty()){

            count++;
            next = new ArrayList<>();

            for(int i : list){
                if(i>target){
                    continue;
                }else if(i==target){
                     min = count;
                    return;
                }
                next.add(i*10+1);
                next.add(i*2);
            }

            list = next;
        }
    }

}

처음에는 이렇게 풀었는데 제출하니까 틀렸다

overflow가 일어났나..?

첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.

그런듯함 10의 9승이면 Integer의 끝인데

거기다가 10을 곱했다고 생각하면 범위 초과임

 

✨Long으로 바꿔주고 맞았다

'Coding Test' 카테고리의 다른 글

[백준] 예산  (0) 2024.04.16
[백준] 세탁소 사장 동혁  (0) 2024.04.16
[백준] 카드 정렬하기  (0) 2024.04.11
[프로그래머스] 과제 진행하기  (0) 2024.04.11
[백준] 안전 영역  (0) 2024.04.11