Baekjoon

1697 - 숨바꼭질

kjy0349 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]);
    }
}