๋ํ์ ์ธ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ.
์ค๋์ Union find ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ๊ธ์ ์๋์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
์ด ๊ธ์์ ์์๋ณผ ๋ด์ฉ
- Union find ์๊ณ ๋ฆฌ์ฆ
- ํต์ฌ ์์ด๋์ด
- ์์ ๋ฌธ์
- ๋ง์น๋ฉด์
Union find ์๊ณ ๋ฆฌ์ฆ
๊ธฐ๋ณธ์ ์ผ๋ก Union-find ์๊ณ ๋ฆฌ์ฆ์ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋์ Disjoint Set (์ํธ๋ฐฐํ์ ์ธ ์งํฉ) ์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋๋ฐ์. ์๋์ ๊ทธ๋ฆผ์ ํตํด ๊ฐ๋จํ ํ์ ํด๋ด ์๋ค.
์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ํ์ ํ์ จ๋์? ์ํธ๋ฐฐํ์ ์งํฉ์ ๊ฐ์ ๊ทธ๋ฃน์ ์ํ์ง๋ง ๊ณตํต์ ์ ์๋ ์งํฉ์ ๋ปํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Union-find๋ ์ด๋ฐ ์ํธ๋ฐฐํ์ ์งํฉ์์์ ๋ฐ์ดํฐ ์กฐ์์ ํ๋ ์๋ฃ๊ตฌ์กฐ ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฐ ์๋ฃ๊ตฌ์กฐ๋ ์ ํ์ํ ๊น์?
์ด๋ค ์ ์ ๊ณผ ์ ์ ์ ์ฐ๊ฒฐ์ ์ด๋ป๊ฒ ํ์ ํ ์ ์์๊น์? BFS, DFS ์ ๊ฐ์ ํ์์ผ๋ก๋ ์ฐ๊ฒฐ์ ํ์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ํ ๋๋ง๋ค O(n)์ด๋ผ๋ ์์ ํ์์ ๊ฑฐ์ณ์ผํ์ฃ . ์ด๋ ๊ต์ฅํ ๋นํจ์จ์ ์ ๋๋ค. ํ์ง๋ง ๋ง์ฝ ์ด๋ค์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ผ๋ฉด ์ด๋จ๊น์? ๊ทธ๋ฃน ์์ ์๋ ๋ ธ๋๋ค์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ Union-find ๋ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ทธ๋ฃน์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด์ฃ . ํต์ฌ ์์ด๋์ด๋ ์๋์์ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํต์ฌ ์์ด๋์ด
์์์๋ ๋งํ๋ค์ํผ. Union-find ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๊ฒ ํด์ค๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ ๊น์? ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
- makeset : X ๋ง์ ๊ฐ์ง๋ ์งํฉ์ ์ด๊ธฐํ ํ๋ค.
- find : ํด๋น ๋ ธ๋๊ฐ ์ด๋ค ๊ทธ๋ฃน(์งํฉ)์ ์ํ๋์ง ํ์ ํ๋ค.
- union : ๋ ๊ฐ์ ์งํฉ์ ํ๋๋ก ํฉ์น๋ค.
๊ฐ๋จํ ๋งํ์๋ฉด. ์ด๊ธฐํํ๊ณ ์ฐพ๊ณ ํฉ์น๋ค. ์ด๊ฒ Union-find ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ถ์ ๋๋ค. ์๋์ ๊ทธ๋ฆผ์ ํตํด ์ด ๊ณผ์ ์ ์ดํด๋ด ์๋ค.
๋๊ฐ ์ด๋ฐ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค. ์ฐ๋ฆฌ ๋์ผ๋ก ๋ณด๋ฉด ๋ค ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์์ง๋ง. ์ปดํจํฐ๋ก ์ฐ๊ฒฐ๋๋ค๋ ๊ฒ์ ํ์ ํ๊ธฐ๋ ๊ฝค๋ ๊ท์ฐฎ์์ง๋๋ค. ์ด๊ฑธ ์ปดํจํฐ๊ฐ ์์๋จน๊ธฐ ์ฝ๊ฒ ๋ฐ๊ฟ๋ด ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํจ์ฌ ์์๋ณด๊ธฐ ์ฌ์์ง๋๋ค. ์ด ๊ณผ์ ์ด ๋ฐ๋ก Union-find ์ ๊ณผ์ ์ ๋๋ค. ๊ฐ๋ตํ๊ฒ ํํํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ(๊ทธ๋ฃน)๋ฅผ ํ์ธํ๋ค. (find)
- ํ์ฌ ๋ถ๋ชจ์ ๊ฐ๋ณด๋ค ๋น๊ตํ ๋ค๋ฅธ ๋ถ๋ชจ์ ๊ฐ์ด ๋ ์๋ค๋ฉด ๋ถ๋ชจ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. (union)
- ์์ ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์์ ์๋ ๊ทธ๋ํ ๊ทธ๋ฆผ1 ์ ํตํด ํ๋ฒ ์คํํด๋ณด์ธ์! ๊ทธ๋ฌ๋ฉด ๊ทธ๋ํ ๊ทธ๋ฆผ 2 ์ ๊ทธ๋ฆผ์ ๋์ถํด๋ผ ์ ์์ ๊ฒ ์ ๋๋ค. ์ด์ ๋จ์ ๊ฒ์ ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ ์ ๋๋ค.
์์ ๋ฌธ์
๋ฌธ์ ๋ ๊ฐ๋จํฉ๋๋ค. {0, 1, 2, 3, 4, 5, 6} ์ด๋ผ๋ ์ํธ๋ฐฐํ์ ๋ถ๋ถ์งํฉ์ Union find ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ทธ๋ฃน์ ๊ตฌ์ฑํด๋ณผ ๊ฒ ์ ๋๋ค. ์๋ง ์ถ๋ ฅํ๋ฉด ["-1, "0", "0", "0", "0", "0", "0"] ๊ณผ ๊ฐ์ ๊ฐ์ด ๋์ค๊ฒ ๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋ผ ํ๋ฒ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
def find(v, list_):
if(list_[v] < 0):
return v
else:
list_[v] = find(list_[v], list_)
return list_[v]
def union(from_, to, list_):
from_ = find(from_, list_)
to = find(to, list_)
if(from_ is not to):
list_[to] = from_
node = 7
list_ = [-1] * node
for i in range(node-1):
union(i, i + 1, list_)
print(list_)
์ ๋ง ๊ฐ๋จํ ์ฝ๋์ ๋๋ค. union() ๊ณผ find() ๋ฅผ ์ง์คํด์ ์ดํด๋ณด์ธ์. find๋ฅผ ํตํด์ ์ํด์๋ ๊ทธ๋ฃน์ ์ฐพ๊ณ . union์์๋ ๊ทธ๋ฃน์ ๋น๊ตํ๋ค์ ๋ ๋ถ๋ถ์งํฉ์ ํฉ์นฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ฒ์์ ์ํ๋ ["-1, "0", "0", "0", "0", "0", "0"] ๋ฅผ ๋์ถํด๋ผ ์ ์์ต๋๋ค. 0์ด๋ผ๋ ๊ทธ๋ฃน์ ๋ชจ๋ ๋ฌถ์ ๊ฒ์ด์ฃ . ์ด์ ๋ถํฐ ์ง์ ์น์๋ฉด์ ์ตํ๋ณด๋๋ก ํ์ธ์!
๋ง์น๋ฉด์
๋ค์๋ฒ์๋ ์ด๋ฐ Union-find ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์. MST(์ต์ ์ ์ฅ ํธ๋ฆฌ) ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์๋ ค๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค. ํผ๋๋ฐฑ, ์ง๋ฌธ์ ์ธ์ ๋ ํ์์ ๋๋ค. ๊ธด๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
'Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ : ๋ฐฑ์ค 11000๋ฒ - ๊ฐ์์ค ๋ฐฐ์ (0) | 2022.02.24 |
---|---|
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ - Python (0) | 2021.09.28 |