문제풀이

[SW Academy] 3289 서로소 집합 - JAVA

자르비옹스 2022. 2. 23. 11:14

1. 문제 유형 : union-find

2. 시간복잡도 : O(NM)

 

유니온파인드를 적용할 수 있는 간단한 예시 문제였다.

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

public class Solution {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = null;
		int T = Integer.parseInt(in.readLine());
		for (int tc = 1; tc <= T; tc++) {
			sb.append("#").append(tc).append(" ");
			st = new StringTokenizer(in.readLine());
			int N = Integer.parseInt(st.nextToken());
			int M = Integer.parseInt(st.nextToken());
			int[] parents = new int[N+1];	// 각 원소의 대표자 인덱스 저장
			makeSet(parents);	// 초기에는 자신이 대표자

			for (int i = 0; i < M; i++) {
				st = new StringTokenizer(in.readLine());
				int cmd = Integer.parseInt(st.nextToken());
				if(cmd == 0) {
					// UNION
					union(parents, Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
				}else {
					// CHECK
					sb.append(checkSet(parents, Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())));
				}
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
	
	public static void makeSet(int[] parents) {
		for (int i = 0; i < parents.length; i++) {
			parents[i] = i;
		}
	}
	
	public static int findSet(int[] parents, int a) {
		if(a == parents[a]) return a;
		return parents[a] = findSet(parents, parents[a]);	// path compression
	}

	public static void union(int[] parents, int a, int b) {
		int aRoot = findSet(parents, a);
		int bRoot = findSet(parents, b);
		if(aRoot == bRoot) return;
		
		parents[bRoot] = aRoot;
	}
	
	public static int checkSet(int[] parents, int a, int b) {
		int aRoot = findSet(parents, a);
		int bRoot = findSet(parents, b);
		if(aRoot == bRoot) return 1;
		return 0;
	}
}