์ฐธ๊ณ ์๋ฃ : [์๊ณ ๋ฆฌ์ฆ] Union-Find ์๊ณ ๋ฆฌ์ฆ
์ด ๋ฌธ์ ๋ union ์ฐ์ฐ์ ๋ํ ์ต์ ํ๊ฐ ํ์ํ ๋ฌธ์ ์ด๋ค. union ์ฐ์ฐ์ ์ต์ ํ๋ก๋ union-by-rank๋ฅผ ์ฌ์ฉํ๋ค.
ํธ๋ฆฌ๋ก ์ฐ๊ฒฐํ ๋ ์ต์ ์ ๊ฒฝ์ฐ๋ ํธ๋ฆฌ์ ์ฅ์ ์ ์ ํ ์ด๋ฆฌ์ง ๋ชปํ๊ณ ์ผ๋ ฌ๋ก ์๋ฃ๊ฐ ๊ณ์ ๋์ด๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด ๊ฒฝ์ฐ union, find ์ฐ์ฐ ๋ชจ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(N)์ด ๋์ด๋ฒ๋ฆฐ๋ค. ์ด๋ ๋ฐฐ์ด๋ก ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ find ์ฐ์ฐ๊ณผ union ์ฐ์ฐ์ ์ต์ ํํด์ฃผ์ด์ผ ํ๋๋ฐ, ๋๋ ๊ทธ๋์ find ์ฐ์ฐ ์ต์ ํ(๊ฒฝ๋ก ์์ถ)๋ง ์๊ณ ์์๋ค. union ์ฐ์ฐ์ ์ต์ ํ์ธ union-by-rank๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ค.
- rank ๋ฐฐ์ด์ ํธ๋ฆฌ์ ๋์ด๋ฅผ ์ ์ฅํ๋ค.
- union ์ฐ์ฐ ์ ํญ์ ๋์ด๊ฐ ๋ ๋ฎ์ ํธ๋ฆฌ๋ฅผ ๋์ ํธ๋ฆฌ ๋ฐ์ ๋ฃ๋๋ค. ์ฆ, ๋์ด๊ฐ ๋ ๋์ ์ชฝ์ root๋ก ์ผ๋๋ค.
- ๋ ํธ๋ฆฌ์ rank๊ฐ ๋์ผํ์ฌ ๋์ด๊ฐ ๋์์ ธ์ผ๋ง ํ๋ ๊ฒฝ์ฐ์๋ union ์ฐ์ฐ ํ ๊ฒฐ๊ณผ ํธ๋ฆฌ์ rank๋ฅผ 1 ์ฆ๊ฐ ์์ผ์ค๋ค.
void union(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return;
if (rank[a] < rank[b]) root[a] = b;
else {
root[b] = a;
if (rank[a] == rank[b]) rank[a] ++;
}
}