ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13549 - 숨바꼭질 3
    Baekjoon 2022. 4. 22. 21:18

    이전에 있었던 숨바꼭질 문제와 같은 문제인데, 가중치가 모든 경우마다 같은것이 아닌 0 - 1 총 두 가지의 가중치를 가진 문제이다.

     

    같은 가중치를 가지고 있을 경우, BFS를 실행하면 최선의 답을 구할 수 있지만, 다른 가중치를 가지고 있을 경우 BFS를 돌린다고해서 최선의 답이 아닐 수 있다. (방문한 노드가 이전에 BFS를 돌렸던 노드보다 가중치가 클 수 있다.)

    그래서, 보통 Queue를 2개 사용하여 현재 큐 - 다음 큐 와 같은 형식으로 구현해 문제를 풀이하게 된다.

    하지만, Deque 자료구조를 이용하여 addFirst, addLast 메소드들을 이용하면 Deque 하나로 문제를 풀이 할 수 있게 된다.

    가중치가 더 작은 쪽이 *2 연산을 하는 쪽이므로(0초 소요), 큐의 앞쪽에 삽입하여 먼저 처리 될 수 있게 하고, 나머지 경우들은 큐의 뒤쪽에 섭입하여 앞쪽에서 가중치가 더 작은 경우들이 먼저 다 실행되고 난 후 실행되게 구현하였다.

    import java.io.*;
    import java.util.*;
    
    public class Main {
        static int MAX = 200000;
        public static void bfs(int N, boolean[] map, int[] time, int[] from) {
            Deque<Integer> dq = new LinkedList<>();
            dq.add(N);
            map[N] = true;
            while (!dq.isEmpty()) {
                int current = dq.poll();
                if (current * 2 < MAX) {
                    if (!map[current * 2]) {
                        dq.addFirst(current * 2);
                        time[current * 2] = time[current];
                        from[current * 2] = current;
                        map[current * 2] = true;
                    }
                }
                if (current - 1 >= 0) {
                    if (!map[current - 1]) {
                        dq.addLast(current - 1);
                        time[current - 1] = time[current] + 1;
                        from[current - 1] = current;
                        map[current - 1] = true;
                    }
                }
                if (current + 1 < MAX) {
                    if (!map[current + 1]) {
                        dq.addLast(current + 1);
                        time[current + 1] = time[current] + 1;
                        from[current + 1] = current;
                        map[current + 1] = true;
                    }
                }
            }
        }
    
        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[] time = new int[MAX];
            boolean[] map = new boolean[MAX];
            int[] from = new int[MAX];
            bfs(N, map, time, from);
            System.out.println(time[K]);
        }
    }

    주의해야 할 부분은, 가중치가 같을 경우(-1, +1 모두 가중치가 1로 동일함) 두 경우 중 더 최선인 경우로 선택해야 한다. 이외에는 동일함.

    'Baekjoon' 카테고리의 다른 글

    20055 - 컨베이어 벨트 위의 로봇  (0) 2022.05.24
    1261 - 알고 스팟  (0) 2022.04.22
    14226 - 이모티콘  (0) 2022.04.20
    7562 - 나이트의 이동  (0) 2022.04.20
    13913 - 숨바꼭질 4  (0) 2022.04.20
Designed by Tistory.