Development Palette

n7465_창용 마을 무리의 개수 본문

Algorithm/SWEA

n7465_창용 마을 무리의 개수

징주 2021. 8. 24. 20:37

이전에 사용한 union-find 코드와 완전 동일

여기서는 그룹의 개수가 몇개인지가 핵심 구현 부분이였다. 즉, 대표자의 개수를 알아내는것 !

package com.swea.w0824.n7465_창용마을무리의개수;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Solution {
	
	static int N;
	static int [] parents;
	
	static void make() {
		for(int i=1; i<=N;i++) {
			parents[i] = i;
		}
	}
	
	static int find(int a) {
		if(a==parents[a]) return a;
		
		return parents[a] = find(parents[a]);
	}
	
	static boolean union(int a, int b) {
		int aRoot = find(a);
		int bRoot = find(b);
		
		parents[bRoot] = aRoot;
		return true;
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		StringTokenizer st = null;
		for(int t = 1; t<= T; t++) {
			sb.append("#"+t+" ");
			Set<Integer> root = new HashSet<>();
			
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());	//사람 수 //정점 수
			int M = Integer.parseInt(st.nextToken());	//서로 알고 있는 사람의 관계 수 // 간선 수
		
			parents = new int[N+1];	
			
			make();	//각 원소들의 집합 만들기
			
			for(int m = 0; m < M; m++) {	//간선 수만큼 입력, 입력값끼리 합치기
				st = new StringTokenizer(br.readLine());
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());
				
				if(find(a) != find(b)) {
					union(a,b);
				}
			}
			
			for(int n = 1; n <= N; n++) {	//정점들의 root를 set에 넣기 // 중복제거
				int X = find(n);
				root.add(X);
			}
			sb.append(root.size()+"\n");
			
		}
		System.out.println(sb);
		
	}
}

'Algorithm > SWEA' 카테고리의 다른 글

6026_성수의비밀번호공격  (0) 2021.09.28
s5215_햄버거다이어트  (0) 2021.09.26
n3289_서로소  (0) 2021.08.24
[D4] n1223_계산기2  (0) 2021.08.20
[D3] n6808_규영이와인영이의카드게임  (0) 2021.08.14
Comments