728x90

문제

수빈이의 위치와 동생의 위치가 주어졌을 때

수빈이가 동생을 찾기까지 걸리는 가장 빠른 시간을 구하는 문제

 

수빈이는 1초마다 좌우로 한 칸 이동하거나

순간 이동하여 현재 위치 * 2만큼 이동할 수 있다.

 

접근 방식

DFS 혹은 BFS를 이용해서 풀 수 있는 문제로 BFS로 풀어보겠다.

 

기존에 풀던 BFS 문제와는 다르게 2차원 배열이 주어지지 않았는데

2차원 배열에서는 현재 위치에서 상하좌우로 탐색을 했다면

이번에는 현재 위치에서 좌우로 한 칸 혹은 현재 위치 * 2만큼

이동하면서 탐색하면 된다.

 

BFS에서 큐는 먼저 방문한 순서대로 정렬되기 때문에

동생의 위치에 처음 방문했을 때 시간을 기록하고

반복문을 종료하면 가장 빠르게 방문할 수 있는 시간을 알 수 있다.

 

풀이

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(), " ");

		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		int[] road = new int[200002];

		Queue<Integer> queue = new ArrayDeque<>();
		queue.offer(n);
		road[n] = 1;

		if (n == k && n == 0) {
			System.out.println(0);
			return;
		}

		while (road[k] == 0) {
			int cur = queue.poll();
			int x = 0;

			for (int i = 0; i < 3; i++) {
				switch (i) {
					case 0: {
						x = cur - 1;
						break;
					}
					case 1: {
						x = cur + 1;
						break;
					}
					case 2: {
						x = cur * 2;
						break;
					}
				}

				if (x < 0 || x >= 200002) continue;
				if (road[x] > 0) continue;

				queue.offer(x);
				road[x] = road[cur] + 1;
			}
		}

		System.out.println(road[k] - 1);
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 10026번 : 적록색약  (0) 2023.10.11
[백준] 1012번 : 유기농 배추  (0) 2023.10.11
[백준] 4179번 : 불!  (0) 2023.10.10
[백준] 7576번 : 토마토  (2) 2023.10.10
[백준] 2178번 : 미로 탐색  (0) 2023.10.09

+ Recent posts