본문 바로가기
알고리즘/코드트리 문제풀이

코드트리 [자바 java] 그래프 탐색

by 잔디🌿 2023. 7. 27.

    https://www.codetree.ai/missions/2/problems/graph-traversal/description

     

    코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

    국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

    www.codetree.ai

     

    정점과 간선이 주어지고, 1에서 출발해서 도착할 수 있는 정점을 구하는 문제이다.

    처음에는 유니온파인드로 풀어야하나 했지만, 생각해보니 dfs로 탐색하고, 방문한 수로 같은 그래프에 해당하는 정점의 갯수를 구하는게 더 빨랐다.

    리스트를 이용해서 각 정점과 연결되어있는 정점들을 저장했고, 1번리스트에 있는 정점들부터 stack에 차례로 쌓으면서 dfs를 수행했다.

     

    import java.io.*;
    import java.util.*;
    
    
    
    
    public class Main {
    
        public static void main(String[] args) throws IOException{
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
    
            List<Integer>[] list = new LinkedList[n+1];
    
            for(int i = 1;i<=n;i++){
                list[i] = new LinkedList<>();
            }
    
            for(int i = 0;i<m;i++){
                st = new StringTokenizer(br.readLine());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
    
                list[a].add(b);
                list[b].add(a);
            }
    
            Stack<Integer> stack = new Stack<>();
    
            for(int i = 0;i<list[1].size();i++){
                stack.push(list[1].get(i));
            }
    
            boolean[] vis = new boolean[n+1];
            vis[1] = true;
    
            while(stack.isEmpty() != true){
                int k = stack.pop();
                if(vis[k] == false){
                    vis[k] = true;
                    for(int i = 0;i<list[k].size();i++){
                        int g = list[k].get(i);
                        if(vis[g] == false){
                            stack.push(g);
                        }
                    }
                }
    
            }
    
            int cnt = 0;
            for(int i = 2;i<=n;i++){
                
                if(vis[i] == true) {
                    cnt++;
                }
            }
    
            System.out.println(cnt);
    
        }
    }