๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€ 4์ฃผ ์ฐจ ํ•™์Šต ์ผ๊ธฐ - 1
ย - Last update: 2023-09-04

๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๋ž€?

๊ตฌ๋ฆ„ ์ด๋ผ๋Š” ๊ณณ์—์„œ ๋ฌธ์ œ ํ’€์ด ์ฑŒ๋ฆฐ์ง€(๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€)๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฐธ์—ฌ ์ค‘์ด๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๊พธ์ค€์ด ์˜ฌ๋ผ์˜ค๋ฉฐ, ์ฃผ์— 2ํšŒ์”ฉ (ํ˜น์€ ๊ทธ ์ด์ƒ) ์ฑŒ๋ฆฐ์ง€ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์ดํ•ด๋ณด๊ณ , ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ด์ œ ๋งˆ์ง€๋ง‰ ์ฃผ์ฐจ์ธ 4์ฃผ์ฐจ๋‹ค. 4์ฃผ์ฐจ์˜ ์ฒซ ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ถœ์ œ๋˜์—ˆ๋‹ค.

๋ฌธ์ œ ํ’€์ด

ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ๋Š” ๋‚˜์˜ ๊ฒฝ์šฐ Union Find๋กœ ์ ‘๊ทผํ–ˆ๋‹ค. ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š” ๋…€์„๋“ค์„ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” ์ด๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ์—..

ํŠน์ดํ•  ๋งŒํ•œ ์กฐ๊ฑด์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋  ๋•Œ์—๋งŒ ์—ฐํ•ฉ์œผ๋กœ ์ธ์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ผ๋‹จ ์ž…๋ ฅ์„ ์ญ‰ ๋ฐ›์€ ์ดํ›„, ๋‹ค์‹œํ•œ๋ฒˆ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ์—ฐํ•ฉ์„ ์ด๋ฃจ๋Š” ๋…€์„๋“ค์€ merge ํ•ด์ค€๋‹ค. ์ด ํ›„, set์„ ํ™œ์šฉํ•ด์„œ, ๋ฃจํŠธ ์ •์ ์„ ์ง‘์–ด๋„ฃ์–ด์ค€ ๋’ค unique ํ•œ ๋…€์„๋“ค์˜ ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๋‚ด ํ’€์ด์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ •์ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ฒดํฌํ•˜๋Š” ๋ถ€๋ถ„ ๋•Œ๋ฌธ์— O(N2)O(N^2)๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ์ด ์—ฐ๊ฒฐ์„ ์ฒดํฌํ•˜๋Š” ๋ถ€๋ถ„์„ ์ธ์ ‘๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(M+N)O(M + N)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๋‚ด ํ’€์ด

#include <bits/stdc++.h>
using namespace std;
bool conn[2001][2001];
int N, M;
struct UF {
int parent[2001];
UF() {
for(int i = 0; i <= 2000; ++i) parent[i] = i;
}
int getRoot(int v) {
if (v == parent[v]) return v;
return parent[v] = getRoot(parent[v]);
}
void merge(int a, int b) {
a = getRoot(a);
b = getRoot(b);
if (a == b) return;
parent[b] = a;
}
} uf;
int main() {
scanf("%d %d", &N, &M);
for(int i = 0; i < M; ++i) {
int a, b; scanf("%d %d", &a, &b);
conn[a][b] = true;
}
for(int a = 1; a <= N; ++a) {
for(int b = a + 1; b <= N; ++b) {
if (conn[a][b] == true && conn[b][a] == true) {
uf.merge(a, b);
}
}
}
set<int> uq;
for(int a = 1; a <= N; ++a) {
uq.insert(uf.getRoot(a));
}
printf("%d\n", (int)uq.size());
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: