ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Q. 1697 자바 : 숨바꼭질
    코딩테스트/백준_Java 2023. 4. 8. 13:16

    Q. 1697 자바 : 숨바꼭질

     

    문제 : boj.kr/1697

    실버 1 난이도의 문제이다.

     

    두 점 N, K가 주어지고, N이 이동할 수 있는 방식은 총 3개이며 각각 1초가 소요된다면(N + 1, N - 1, N * 2)N이 K로 갈 수 있는 가장 빠른 시간을 구하는 문제이다.

     

    만약 그래프 탐색 관련 문제를 풀고 있지 않았다면처음 이 문제를 봤을 때 그래프 탐색 문제라고 생각하지 못했을 것 같다.고민해보니 세가지 이동방식에 대한 BFS를 이용하면 풀 수 있을 것 같아 이 방식을 이용해서 풀었다.

     

    1. 정점 N에서 이동 가능한 세 가지 방식에 따른 좌표를 큐에 넣는다.2. 만약 방문했다면 재방문하지 않는다.(가장 먼저 방문한 경우가 가장 빠른 경우이므로 재방문했다면 더 빨라질 수는 없다.)

     

    시간복잡도를 계산하기 위해 범위를 찾아보니0 <= N ,K <= 100,000이므로 최악의 경우는 N이 100000, K가 0인 경우에-1을 이동하는 방식으로 100,000번 이동해야 K의 위치에 갈 수 있다.따라서 시간초과는 걱정하지 않아도 된다.

     

    풀이는 아래와 같다.

    import java.io.*;
    import java.util.*;
    
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int N, K;
    
        static int MAX_VALUE = 100000;
    
        static int[] dist;
        static boolean[] visit;
        static void input() {
    
            N = scan.nextInt();
            K = scan.nextInt();
            dist = new int[MAX_VALUE + 1];
            visit = new boolean[MAX_VALUE + 1];
        }
    
        static void bfs(int s) {
    
            Queue<Integer> que = new LinkedList<>();
            que.add(s);
            dist[s] = 0;
            visit[s] = true;
    
            while (!que.isEmpty()) {
    
                int cur = que.poll();
                int nx = cur + 1;
                int ny = cur - 1;
                int nz = cur * 2;
                if (nx <= MAX_VALUE && !visit[nx]) {
                    que.add(nx);
                    visit[nx] = true;
                    dist[nx] = dist[cur] + 1;
                }
                if (ny >= 0 && !visit[ny]) {
                    que.add(ny);
                    visit[ny] = true;
                    dist[ny] = dist[cur] + 1;
                }
                if (nz <= MAX_VALUE && !visit[nz]) {
                    que.add(nz);
                    visit[nz] = true;
                    dist[nz] = dist[cur] + 1;
                }
            }
        }
    
        static void pro() {
    
            bfs(N);
            System.out.println(dist[K]);
        }
    
        public static void main(String[] args) {
            input();
            pro();
        }
    
    
        static class FastReader {
            // BufferedReader의 빠른 속도,
            // + Scanner의 타입별 입력값을 받는 기능을 혼합
            // (자바 내부에 구현된 Scanner는 속도가 느림)
            // 다른분의 코드를 참고한 코드
            BufferedReader br;
            StringTokenizer st;
    
            public FastReader() {
                br = new BufferedReader(new InputStreamReader(System.in));
            }
    
            public FastReader(String s) throws FileNotFoundException {
                br = new BufferedReader(new FileReader(new File(s)));
            }
    
            String next() {
                while (st == null || !st.hasMoreElements()) {
                    try {
                        st = new StringTokenizer(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                return st.nextToken();
            }
    
            int nextInt() {
                return Integer.parseInt(next());
            }
    
            long nextLong() {
                return Long.parseLong(next());
            }
    
            double nextDouble() {
                return Double.parseDouble(next());
            }
    
            String nextLine() {
                String str = "";
                try {
                    str = br.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return str;
            }
        }
    }
    반응형

    '코딩테스트 > 백준_Java' 카테고리의 다른 글

    Q. 7562 자바 : 나이트의 이동  (0) 2023.04.10
    Q. 3055 자바 : 탈출  (0) 2023.04.09
    Q. 2178 자바 : 미로 탐색  (0) 2023.04.07
    Q. 11725 자바 : 트리의 부모 찾기  (0) 2023.04.06
    Q. 11403 자바 : 경로 찾기  (0) 2023.04.05

    댓글

Designed by Tistory.