[java]창용 마을 무리의 개수 - SWEA 7465

풀이

문제 해석을 하자면,

  • 주어진 두사람 간의 관계들을 이용하여 총 무리의 개수를 구하자.


풀이

  • 단순 구현으로 풀려다가 2시간을 날린 문제… ㅜㅜ
  • 간단히 완전탐색(dfs)+visited(방문) 으로 해결이 된 문제였다…

image



코드

public static int result; // 무리 개수

public static void dfs(int idx, boolean[] visited, List<Integer>[] inArr) {
    List<Integer> inNum = inArr[idx];
    for(int num : inNum) {
        if(visited[num]) continue;
        visited[num] = true;
        dfs(num, visited, inArr);
    }
}

public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();
    int T = Integer.parseInt(br.readLine());
    for(int t=1; t<=T; t++) {
        //init
        result=0;
        //input
        StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(stk.nextToken());
        int M = Integer.parseInt(stk.nextToken());
        boolean[] visited = new boolean[N+1]; // 매번 할당
        List<Integer>[] inArr = new ArrayList[N+1]; // 매번 할당
        for(int i=0; i<N+1; i++) inArr[i] = new ArrayList<>(); // 초기화
        for(int i=0; i<M; i++) {
            stk = new StringTokenizer(br.readLine(), " ");
            int n1 = Integer.parseInt(stk.nextToken());
            int n2 = Integer.parseInt(stk.nextToken());
            inArr[n1].add(n2);
            inArr[n2].add(n1); // 양방향 간선
        }
        //run
        for(int i=1; i<=N; i++) {
            if(visited[i]) continue; 
            dfs(i, visited, inArr);
            result++; // 이곳까지 오면 무리 1개 추가된 것
        }
        //output
        sb.append("#"+t+" "+result+"\n");
    }
    System.out.print(sb);
}



느낀점

생략

댓글남기기