이러한 방식으로 탐색하면서 N이 K와 같은 상황을 찾는다.
이전 위치에서 시간 + 1
을 하여 관리한다.package Algorithm.P1697;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class P1697 {
static int N, K;
static Queue<Integer> queue;
static int[] visited;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/Algorithm/P1697/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
queue = new LinkedList<>();
visited = new int[100001];
queue.add(N);
if (N == K) {
System.out.println("0");
} else {
bfs(N);
}
}
private static void bfs(int n) {
queue.add(n);
visited[n] = 1; // 방문 표시
while (!queue.isEmpty()) {
int temp = queue.poll(); // 값을 빼낸다.
for (int i = 0; i < 3; i++) {
int next;
if (i == 0) {
next = temp - 1;
} else if (i == 1) {
next = temp + 1;
} else {
next = temp * 2;
}
if (next == K) {
System.out.println(visited[temp]);
return;
}
// 다음 지점이 범위 안에 있고, 방문하지 않았다면 queue에 넣는다.
if (next > 0 && next < visited.length && visited[next] == 0) {
queue.add(next);
visited[next] = visited[temp] + 1;
}
}
}
}
}
Reference