카테고리 없음

백준 1697번: 숨바꼭질

yesman9 2024. 6. 11. 16:56

현재위치가 x라고 했을 때,

x-1
x+1
2*x

를 반복해서 수빈 위치(start)에서 동생 위치(end)까지 최소 몇 번 만에 갈 수 있는지 구해야한다.
따라서 BFS를 사용하면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int start;
	static int end;
	static boolean[] visited;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		visited = new boolean[100000 + 1];

		start = Integer.parseInt(st.nextToken()); // 수빈이 위치
		end = Integer.parseInt(st.nextToken()); // 동생 위치
		int cnt = bfs(start, end);

		bw.write(String.valueOf(cnt));
		bw.flush();
		bw.close();
	}

	private static int bfs(int start, int end) {
		Queue<Integer> queue = new LinkedList<>();
		queue.add(start);
		visited[start] = true; // 방문 처리

		int cnt = 0;
		while (!queue.isEmpty()) {
			int size = queue.size();
			for (int i = 0; i < size; i++) {
				int curr = queue.poll();
				if (curr == end) {
					return cnt;
				}
				// x-1로 이동
				if (curr - 1 >= 0 && !visited[curr - 1]) {
					queue.add(curr - 1);
					visited[curr - 1] = true;
				}
				// x+1로 이동
				if (curr + 1 <= 100000 && !visited[curr + 1]) {
					queue.add(curr + 1);
					visited[curr + 1] = true;
				}
				// 2*x로 이동
				if (curr * 2 <= 100000 && !visited[curr * 2]) {
					queue.add(curr * 2);
					visited[curr * 2] = true;
				}
			}
			cnt++;
		}
		return -1; // 이 부분은 논리적으로 도달하지 않음
	}
}