포스트

[백준][1717] 집합의 표현

이 포스트는 백준 사이트의 집합의 표현 문제 풀이입니다.

문제

문제


해결 과정

이 문제는 Union-Find 알고리즘을 활용하면 쉽게 해결할 수 있습니다.

첫 상태는 문제의 설명처럼 0부터 N까지의 각 숫자가 독립적으로 존재하는 상태에서
사용자의 합집합 연산과 집합 확인 연산을 반복적으로 수행하면 됩니다.

여기서 합집합 연산에 사용되는 것이 Union 연산이고
사용자가 입력한 두 숫자의 관계를 확인하기 위해 사용하는 것이 Find 연산입니다.

코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <vector>

vector<int> group;
void Merge(int x, int y);
int Find(int x);

int main() {
	int N, M;
	cin.tie(0)->sync_with_stdio(false);
	cin >> N >> M;
	
	for (int i = 0; i <= N; ++i) {
		group.push_back(i);
    }
	
	for (int i = 0; i < M; ++i) {
		int q, a, b;
		cin >> q >> a >> b;

		if (q == 1) {
			if (Find(a) == Find(b)) printf("YES\n");
			else printf("NO\n");
		}
		else {
			Merge(a, b);
		}
	}

	return 0;
}


void Merge(int x, int y) {
	x = Find(x);
	y = Find(y);

	if (x == y) return;
	group[x] = y;
}

int Find(int x) {
	if (group[x] == x) return x;
	else return group[x] = Find(group[x]);
}


실행 결과

결과


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.