문제 원본 : https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
import java.io.*;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = br.readLine();
int n = Integer.parseInt(s.split(" ")[0]);
int k = Integer.parseInt(s.split(" ")[1]);
int[] arr = new int[100001];
Arrays.fill(arr, -1);
arr[n] = 0;
Queue<Integer> queue = new ArrayDeque<>();
queue.add(n);
while (!queue.isEmpty()) {
int curr = queue.poll();
if (curr * 2 <= 100000 && arr[curr * 2] == -1) {
arr[curr * 2] = arr[curr];
queue.add(curr * 2);
} else if (curr * 2 <= 100000 && arr[curr * 2] > arr[curr]) {
arr[curr * 2] = arr[curr];
queue.add(curr * 2);
}
if (curr - 1 >= 0 && arr[curr - 1] == -1) {
arr[curr - 1] = arr[curr] + 1;
queue.add(curr - 1);
} else if (curr - 1 >= 0 && arr[curr - 1] > arr[curr] + 1) {
arr[curr - 1] = arr[curr] + 1;
queue.add(curr - 1);
}
if (curr + 1 <= 100000 && arr[curr + 1] == -1) {
arr[curr + 1] = arr[curr] + 1;
queue.add(curr + 1);
} else if (curr + 1 <= 100000 && arr[curr + 1] > arr[curr] + 1) {
arr[curr + 1] = arr[curr] + 1;
queue.add(curr + 1);
}
}
bw.write(String.valueOf(arr[k]));
bw.close();
br.close();
}
}
- BFS 문제
- 순간이동은 0초를 소모하기 때문에 해당 지점에 처음 도착했다고 최소 시간이 된다고 보장하지 않는다.
- 예를 들어 입력이 4 6 일 경우,
- 4 -> 5 -> 6 순서로 방문하면 2초가 걸리지만 4 -> 3 -> 6 순서로 방문하면 1초가 걸린다.
- 따라서 최소 시간을 갱신하면 탐색해야 한다.
'알고리즘 > BOJ' 카테고리의 다른 글
| [BOJ] 2629. 양팔저울 (0) | 2022.03.17 |
|---|---|
| [BOJ] 1655. 가운데를 말해요 (0) | 2022.03.16 |
| [BOJ] 2493. 탑 (0) | 2022.03.14 |
| [BOJ] 2239. 스도쿠 (0) | 2022.03.12 |
| [BOJ] 2565. 전깃줄 (0) | 2022.03.11 |