๐น ์ ๋์จ ํ์ธ๋(Union-Find) ์๊ณ ๋ฆฌ์ฆ์ด๋ ?
- ํธ๋ฆฌ/๊ทธ๋ํ์ ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ ๋ ธ๋๊ฐ ๊ฐ์ ๊ทธ๋ํ์ ์ํ๋์ง ํ๋ณํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ํธ ๋ฐฐํ์ ์งํฉ, ์๋ก์ ์งํฉ(Disjoint-Set)์ผ๋ก๋ ๋ถ๋ฆฐ๋ค.
- ๋ ธ๋๋ฅผ ํฉ์น๋ Union ์ฐ์ฐ๊ณผ ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ฐพ๋ Find ์ฐ์ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
๐น ์ ๋์จ ํ์ธ๋ ๊ตฌํ - JAVA
[ find ์ฐ์ฐ ]
private static int find(int x) {
if (parents[x] == x) return x;
return parents[x] = find(parents[x]);
}
- ํน์ ๋ ธ๋๊ฐ ์ํ ์งํฉ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ์ด๋ค.
- ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ํด๋น ๋ ธ๋๋ฅผ ๋น๊ตํ๋ค. ์ด๋ ๋ ๋ ธ๋๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ํด๋น ๋ ธ๋๋ ๋ฃจํธ ๋ ธ๋์ด๋ค.
- ๋ง์ฝ ๊ฐ์ง ์๋ค๋ฉด, ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ๋ํ์ฌ find ์ฐ์ฐ์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ค.
[ union ์ฐ์ฐ ]
public static boolean union(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return false;
if (x < y) parents[y] = x;
else parents[x] = y;
return true;
}
- ๋ ๊ฐ์ ๋ ธ๋๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ์ด๋ค.
- ๋ ๋ ธ๋์ ๋ํด find ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํํ์ฌ, ๋ ๋ ธ๋๊ฐ ๊ฐ๊ฐ ์ํ ์งํฉ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ฐพ์๋ธ๋ค.
- ์ด๋ฏธ ๊ฐ์ ์งํฉ์ ์๋ค๋ฉด false๋ฅผ ๋ฐํํ๊ณ , ๋ค๋ฅธ ์งํฉ์ ์ํด์๋ค๋ฉด, ๋ ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ์ณ์ค๋ค.
๐ reference
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Deque (๋ฑ/๋ฐํฌ) (1) | 2024.07.19 |
---|---|
๋นํธ๋ง์คํฌ (BitMask) (0) | 2024.07.15 |
์์์ ๋ ฌ(Topological Sorting) ์๊ณ ๋ฆฌ์ฆ (0) | 2024.01.12 |
๋ถ๋ถ์งํฉ(Subset) (4) | 2023.10.31 |
๋ฐฑํธ๋ํน(Back-Tracking) (0) | 2023.09.11 |