이번에 풀어본 문제는
백준 16953번 A -> B 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Op {
long num, count;
public Op(long num, long count) {
this.num = num;
this.count = count;
}
}
public class 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 = Long.parseLong(st.nextToken());
long b = Long.parseLong(st.nextToken());
Queue<Op> pq = new PriorityQueue<>(new Comparator<Op>() {
@Override
public int compare(Op o1, Op o2) {
if (o1.num == o2.num) return (int)(o1.count - o2.count);
return (int)(o2.num - o1.num);
}
});
pq.add(new Op(a, 1));
long answer = -1;
while (!pq.isEmpty()) {
Op cur = pq.poll();
if (cur.num == b) {
answer = cur.count;
break;
}
// 곱 2
long multiValue = cur.num * 2;
if (multiValue <= b) pq.add(new Op(multiValue, cur.count + 1));
// 뒤에 1
long addOne = (cur.num * 10) + 1;
if (addOne <= b) pq.add(new Op(addOne, cur.count + 1));
}
System.out.print(answer);
}
}
주어진 두 연산 방식을 통해 A부터 B까지 도달할 수 있는 최소 연산 횟수를 구하는 문제입니다.
두 방법을 통해 A가 B까지 도달할 수 있도록 그래프 탐색 해주면 됩니다.
주의할 점은, 값의 범위가 생각보다 커서 자료형을 long을 사용해야 합니다.