ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Q. 5567 자바 : 결혼식
    코딩테스트/백준_Java 2023. 4. 12. 09:23

    Q. 5567 자바 : 결혼식

     

    문제 : boj.kr/5567

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

     

    간선이 주어지고 탐색을 통해 깊이가 2인 정점까지 방문 가능하다면 몇 개의 정점을 방문 가능한지 세는 문제이다.

    (상근이의 친구 - 깊이가 1, 친구의 친구 - 깊이가 2)

     

    간선만 주어지므로 격자형 그래프가 아니라 ArrayList를 사용해서 문제를 해결했다.

    또한 양방향 그래프이므로 간선을 입력받을 때 두 정점 모두 표시했다.

     

    이 문제의 경우 아래와 같은 방식으로 해결했다.

    1. 입력값을 받아 두 정점에 저장한다.

    2. 깊이우선탐색(DFS)를 시작한다.

    3. 이 때 주의해야 할 점은 깊이가 2일 때 까지 모든 정점을 탐색해야 하므로  방문 여부 확인은 하되, 이미 방문한 정점에 대해서도 탐색한다.

    (어떤 사람에게는 친구의 친구이지만, 다른 사람에게는 친구일 수 있다.)

     

    이 문제의 경우 정점 n이 최대 500개, 간선m이  최대 10,000개이다.

    리스트를 사용한 일반 그래프의 시간복잡도는 O(n + m)으로 시간초과는 걱정하지 않아도 된다.

    또한 자료형 역시 int 범위 내에서 모두 해결할 수 있다.

     

    풀이는 아래와 같다.

    import java.io.*;
    import java.util.*;
    
    
    public class Main {
        static FastReader scan = new FastReader();
        static StringBuilder sb = new StringBuilder();
    
        static int M, N, cnt = -1;
        static List<Integer>[] list;
        static boolean[] visit;
    
        static int[] dy = {0, 1, 0, -1};
        static int[] dx = {1, 0, -1, 0};
    
        static void input() {
    
            N = scan.nextInt();
            M = scan.nextInt();
            list = new List[N + 1];
            visit = new boolean[N + 1];
    
            for (int i = 1; i <= N; i++) {
                list[i] = new LinkedList<>();
            }
    
            for (int i = 0; i < M; i++) {
                int s = scan.nextInt();
                int e = scan.nextInt();
                list[s].add(e);
                list[e].add(s);
            }
        }
    
        static void dfs(int start, int depth) {
            
            if (!visit[start]) {
                visit[start] = true;
                cnt++;
            }
            if (depth == 2) return;
            
            for (int end: list[start]) {
                dfs(end, depth + 1);
            }
        }
    
        static void pro() {
    
            dfs(1, 0);
            System.out.println(cnt);
        }
    
        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. 20364 자바 : 부동산 다툼  (0) 2023.04.15
    Q. 15900 자바 : 나무 탈출  (0) 2023.04.14
    Q. 18404 자바 : 현명한 나이트  (2) 2023.04.11
    Q. 7562 자바 : 나이트의 이동  (0) 2023.04.10
    Q. 3055 자바 : 탈출  (0) 2023.04.09

    댓글

Designed by Tistory.