사용한 것
풀이 방법
- 순간이동(2 X x), 한칸 뒤로(x - 1), 한칸 앞으로(x + 1)를
q
에 넣으면서 현재 x
가 K
와 같으면 answer
에 time
을 넣어주고 break
- 2배로 이동한 값(0초 소요)이 +1로 이동한 값(1초 소요)보다 항상 먼저 계산되어
q
에 들어가므로, 처음으로 K
가 나온 시간이 항상 최소 시간이다.
answer
출력
코드
public class Main {
static final int MAX = 100_000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int N = Integer.parseInt(line[0]);
int K = Integer.parseInt(line[1]);
boolean[] visited = new boolean[MAX + 1];
Queue<Point> q = new LinkedList<>();
q.offer(new Point(N, 0));
int answer = -1;
while (!q.isEmpty()) {
Point p = q.poll();
int x = p.getX();
int time = p.getTime();
visited[x] = true;
if (x == K) {
answer = time;
break;
}
if (x != 0 && 2 * x <= MAX && !visited[2 * x]) {
q.offer(new Point(2 * x, time));
}
if (x - 1 >= 0 && !visited[x - 1]) {
q.offer(new Point(x - 1, time + 1));
}
if (x + 1 <= MAX && !visited[x + 1]) {
q.offer(new Point(x + 1, time + 1));
}
}
System.out.println(answer);
}
}
class Point {
private int x;
private int time;
public Point(int x, int time) {
this.x = x;
this.time = time;
}
public int getX() {
return x;
}
public int getTime() {
return time;
}
}