[BOJ 16953][Silver 1] A → B
백준 16953
제한
시간제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 12707 | 5379 | 4277 | 40.629% |
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
2를 곱한다. 1을 수의 가장 오른쪽에 추가한다. A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
예제 입력1
2 162
예제 출력1
5
예제 입력2
4 42
예제 출력2
-1
예제 입력3
100 40021
예제 출력3
5
풀이
A에서 B로 가는데, 2를 곱했을 경우와 1을 붙였을 경우 가지치기 방식으로 풀이를 해보려 한다.
B 까지 가는 데에 최소경로를 구하기 때문에, DFS방식보단 BFS방식으로 했다.
왜냐하면, DFS방식으로 모든 경우의 수를 왔다갔다하면서 최솟값을 구하는것 보단, BFS방식으로 Depth 마다 발견되는 순간 종료조건이 되는 것이 좀 더 효율적이라 판단해서 BFS를 택했다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BJ_16953_Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Integer.parseInt(st.nextToken());
long B = Integer.parseInt(st.nextToken());
int result = -1;
Queue<Node> queue = new LinkedList<>();
queue.offer(new Node(A,0));
while (!queue.isEmpty()){
Node node = queue.poll();
long num = node.num;
int d = node.depth;
if(num==B){
result = d+1;
break;
}
if(num*2<=B){
queue.offer(new Node(num*2,d+1));
}
if(num*10+1<=B){
queue.offer(new Node(num*10+1,d+1));
}
}
System.out.println(result);
}
static class Node{
long num;
int depth;
public Node(long num, int depth) {
this.num = num;
this.depth = depth;
}
}
}