ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.