정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
- 그래프 이론
- 그리디 알고리즘
- 그래프 탐색
- 너비 우선 탐색
import java.util.*;
import java.io.*;
public class Main {
public static long A, B, result;
public static boolean flag;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
A = Long.parseLong(st.nextToken());
B = Long.parseLong(st.nextToken());
DFS(A, 1);
if(flag)
System.out.println(result);
else
System.out.println(-1);
}
public static void DFS(long num, int count) {
if(num > B)
return;
if(num == B) {
result = count;
flag = true;
return;
}
DFS(num*2, count+1);
DFS(num*10 + 1, count+1);
}
}
DFS를 활용하여 문제를 해결했다. 갈래가 2배, 1붙이기 두가지 밖에 없고, 반복해도 된다.