-
1697 - 숨바꼭질Baekjoon 2022. 4. 19. 18:28
BFS를 이용해, 시작 좌표부터 최종 좌표까지 도달하기위한 최소 시간을 구하는 문제이다.
시작 좌표로부터 그 다음 좌표로 이동하는 방법이 총 3가지 이다.
시작 좌표를 C라고 했을 때, (C - 1, C + 1, C * 2).
따라서 시작 정점으로부터 3개의 자식 노드를 가지는 트리 형식이라고 생각하고 풀이했다.
틀렸던 점들은 주석으로 표시해두는 방식을 채택했다.
각 2차원 배열들의 역할은
map -> 방문 여부
time -> 해당 좌표에 도달하기 위한 최소 시간
이다.
첫 번째 실수는 사소한 실수였고, 두 번째 실수가 엣지 케이스에대한 실수였다.
시작 지점이 0이 아닌 수이고, 도착 지점이 0이라면
항상 -1을 이용해 도착 지점에 도달해야 한다. 하지만 양수 범위만 생각한 나머지 cur - 1 > 0 과 같이 조건문을 작성해 틀리게 되었다.
추가적으로 MAX가 200000인 이유는, N 범위가 0 <= N <= 100000이므로 * 2가 실행되었을 때 최대로 도달 할 수 있는 좌표라고 생각하게되어 200000으로 지정했다.
package backjoon; import java.util.*; import java.io.*; public class P_1697 { static int MAX = 200000; public static void bfs(int N, int[] map, int[] time){ Queue<Integer> q = new LinkedList<>(); q.add(N); map[N] = 1; // 처음에 방문한 N을 방문 처리를 해주지 않음. while (!q.isEmpty()){ int cur = q.poll(); if (cur + 1 < MAX) { if (map[cur + 1] == 0) { q.add(cur + 1); map[cur + 1] = 1; time[cur + 1] = time[cur] + 1; } } if (cur - 1 < MAX && cur - 1 >= 0) // cur - 1이 0이 될 때 까지 돌 필요가 있음. { if (map[cur - 1] == 0) { q.add(cur - 1); map[cur - 1] = 1; time[cur - 1] = time[cur] + 1; } } if (cur * 2 < MAX) { if (map[cur * 2] == 0) { q.add(cur * 2); map[cur * 2] = 1; time[cur * 2] = time[cur] + 1; } } } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] inputs = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); int N = inputs[0]; int K = inputs[1]; int[] map = new int[MAX]; int[] time = new int[MAX]; bfs(N, map, time); System.out.println(time[K]); } }
'Baekjoon' 카테고리의 다른 글
7562 - 나이트의 이동 (0) 2022.04.20 13913 - 숨바꼭질 4 (0) 2022.04.20 7576 - 토마토 (0) 2022.04.19 2225 - 합분해 (0) 2022.04.19 1699 - 제곱수의 합 (0) 2022.04.19