알고리즘/백준
[백준] 16953번 : A -> B - 자바(JAVA)
Junuuu
2022. 8. 22. 00:01
반응형
https://www.acmicpc.net/problem/16953
16953번: A → B
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
www.acmicpc.net
문제 해석
정수 A와 B가 주어집니다.
A로 B를 만드려고 하는데 두가지 연산을 수행할 수 있습니다.
A * 2
A * 10 + 1
이때 필요한 연산의 최솟값을 구해보려고 합니다.
문제 풀이 전 설계
Queue를 사용하고 Number 객체를 만들어 (현재 수, 연산의 step)을 관리합니다.
이때 수는 항상 커집니다.
따라서 Queue에 add하기 전에 현재 수가 B보다 큰 경우에는 add하지 않습니다.
그리고 B가 10억까지 주어질 수 있습니다.
A를 연산하는 과정에 overflow가 발생할 수 있어서 long 타입을 고려해야 합니다.
코드
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 Main {
static class Number {
long num;
int step;
public Number(long num, int step) {
this.num = num;
this.step = step;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
Queue<Number> bfsQ = new LinkedList<>();
bfsQ.add(new Number(A,1));
int result = -1;
while(!bfsQ.isEmpty()){
Number cur = bfsQ.poll();
if(cur.num == B){
result = cur.step;
break;
}
if(cur.num * 10 + 1 <= B) {
bfsQ.add(new Number(cur.num * 10 + 1, cur.step + 1));
}
if(cur.num * 2 <= B) {
bfsQ.add(new Number(cur.num * 2, cur.step + 1));
}
}
System.out.println(result);
}
}