알고리즘/그래프 이론

[백준 1697] 숨바꼭질 Java 풀이

빠르게 핵심만 2024. 4. 29. 17:20

접근

BFS를 이용하여 수빈이가 동생을 찾을 수 있는 가장 빠른 시간을 구할 수 있습니다.

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int n, k;
	static int[] visited;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 입력 처리
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());

		visited = new int[100001];

		// 수빈이가 동생을 찾을 수 있는 가장 빠른 시간을 구하기 위해서 bfs를 이용한다.
		int minTime = bfs();

		// 결과 출력
		System.out.println(minTime);
	}

	static int bfs() {
		Queue<Integer> bfsQ = new ArrayDeque<>();
		bfsQ.offer(n);

		while (!bfsQ.isEmpty()) {
			Integer curr = bfsQ.poll();

			// 동생을 찾은 경우
			if (curr == k) {
				return visited[curr];
			}

			// -1 이동
			if (canGo(curr - 1)) {
				visited[curr - 1] = visited[curr] + 1;
				bfsQ.offer(curr - 1);
			}
			// +1 이동
			if (canGo(curr + 1)) {
				visited[curr + 1] = visited[curr] + 1;
				bfsQ.offer(curr + 1);
			}
			// 순간이동
			if (canGo(2 * curr)) {
				visited[2 * curr] = visited[curr] + 1;
				bfsQ.offer(2 * curr);
			}
		}

		return -1;
	}

	static boolean canGo(int x) {
		return (0 <= x && x <= 100000) && visited[x] == 0;
	}
}