Algorithms

[BOJ] 1717 집합의 표현 Java 풀이

SDev 2021. 2. 26. 12:58
728x90

 

BOJ 1717 집합의 표현

 

그래프 이론 중 Union & Find 개념을 알고 있다면 쉽게 접근할 수 있는 문제다. 합집합 연산에서는 Union, 같은 집합에 포함되어 있는지 확인 연산은 Find로 확인할 수 있다.

기본적으로 단일 Union&Find 연산에서 시간 복잡도는 O(N)인데, 그런 연산이 이 문제에서는 M번 주어지므로, 단순하게 Union & Find를 구현하게 되면 시간초과를 볼 수 있는데, 경로압축기법을 사용해 시간복잡도를 대폭 단축시키면 대략 O(M)번의 연산으로 이 문제를 해결할 수 있다.

 

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

public class Main {
	static int N, M;
	static int[] parents;
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		parents = new int[N+1];
		for(int i = 0; i <= N; i++) {
			parents[i] = i;
		}
		
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int func = Integer.parseInt(st.nextToken());
			int n1 = Integer.parseInt(st.nextToken());
			int n2 = Integer.parseInt(st.nextToken());
			
			if(func == 0) {
				parentUnion(n1, n2);
			}else {
				if(parentFind(n1) == parentFind(n2)) {
					System.out.println("YES");
				}
				else {
					System.out.println("NO");
				}
			}
		}
	}
	
	private static int parentFind(int a) {
		if(parents[a] != a) {
			parents[a] = parentFind(parents[a]);
		}
		return parents[a];
	}
	
	private static void parentUnion(int a, int b) {
		a = parentFind(a);
		b = parentFind(b);
		if(a < b) {
			parents[b] = a;
		}else {
			parents[a] = b;
		}
	}
}