๋ถ๋ฅ:์๋ฃ๊ตฌ์กฐ
์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
1. ๊ฐ์[ํธ์ง]
Union-Find(ํน์ Disjoint Set)์ ์ํธ ๋ฐฐํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์งํฉ์ ํจ์จ์ ์ผ๋ก ํํํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด ์๋ฃ๊ตฌ์กฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์งํฉ์ ๋ณํฉํ๋ Union ์ฐ์ฐ๊ณผ ์งํฉ์ ์์๊ฐ ์ด๋ ํ ์งํฉ์ ์ํด์๋์ง ํ๋จํ๋ Find ์ฐ์ฐ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ Union-Find๋ผ๋ ์ด๋ฆ์ด ๋ถ๊ฒ ๋์๋ค. 1964๋
์ฒ์ ๊ณ ์๋์๋ค. ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์์ ์์ ๊ฐ์ ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ฐ์ ์ฌ์ฉํ๋ค.
2. ์ค๋ช [ํธ์ง]
- Find ์ฐ์ฐ์ ํ๋์ ์์๊ฐ ์ด๋ค ์งํฉ์ ์ํด์๋์ง๋ฅผ ํ๋จํ๋ ์ฐ์ฐ์ ๋งํ๋ค.
- Union ์ฐ์ฐ์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ๋ณํฉํ๋ ์ฐ์ฐ์ ๋งํ๋ค. ์ด ์๋ฃ๊ตฌ์กฐ์์๋ ์ํธ ๋ฐฐํ์ ์งํฉ๋ง์ ๋ค๋ฃจ๋ฏ๋ก Union ์ฐ์ฐ์ ํฉ์งํฉ ์ฐ์ฐ๊ณผ ๋์น์ด๋ค.
- ์ ๋ชจ๋ ์์์ ๊ฐ์๋ก ํ๋ค.
2.1. ์์์ ํํ[ํธ์ง]
ArrayList์ ์ํธ ๋ฐฐํ์ ์งํฉ์ ํํํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด์ ๊ฐ ์์์ ์งํฉ์ ๊ณ ์ ๋ฒํธ๋ฅผ ๋ฃ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ ์์์ ์ ๊ทผํ๋ ๊ฒ ๋ง์ผ๋ก ์ํ ์งํฉ์ ์ ์ ์๊ฒ ๋๋ฏ๋ก Find ์ฐ์ฐ์ ํญ์ ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์จ์ ์ด๋ผ๊ณ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ Union ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด์๋ ArrayList์ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉฐ ๊ฐ ์์๊ฐ ์ํ ์งํฉ์ ๊ณ ์ ๋ฒํธ๋ฅผ ๋ฐ๊ฟ ์ฃผ์ด์ผ ํ๋ฏ๋ก ํญ์ ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ์ ์๋ค. ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ, ํธ๋ฆฌ ํํ๋ก ์งํฉ์ ํํํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
2.2. ๊ธฐ๋ณธ์ ํํ[ํธ์ง]
Disjoint Set์์๋ ํธ๋ฆฌ๋ฅผ ํน์ดํ ์ฉ๋๋ก ์ฌ์ฉํ๋๋ฐ, ํธ๋ฆฌ์ ๊ตฌ์กฐ ์์ฒด๊ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๋ฐ๋ฉด Disjoint Set์์๋ ํธ๋ฆฌ์ ๊ตฌ์กฐ์๋ ์๊ด ์์ด ๋จ ํ๋์ ์ต์์ ๋
ธ๋์๋ง ๊ด์ฌ์ ๊ฐ์ง๋ค. Disjoint Set์ ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์ต์์ ๋
ธ๋๋ ๊ฐ ์งํฉ์ ๋ํํ๋ ๋ํ์ ์ญํ ์ ๋งก๊ฒ ๋๋ค. Disjoint Set์ ํธ๋ฆฌ๋ก ํํํ๊ธฐ ์ํด์๋ ๋จผ์ ArrayList์ ๊ฐ ์์์ ์์ ์ ์ธ๋ฑ์ค ๊ฐ์ด ๋ค์ด๊ฐ ์๋ ์ด๊ธฐ ์ํ๊ฐ ํ์ํ๋ค. ์ด ์ํ์์ ๊ฐ ์์์ ๋ค์ด๊ฐ ์๋ ๊ฐ์ ๊ฐ ์์์ ๋ถ๋ชจ๋ฅผ ์๋ฏธํ๋ค.
2.2.1. Find ์ฐ์ฐ[ํธ์ง]
Find ์ฐ์ฐ์ด ์ํ๋๋ฉด, ์ฌ๊ท์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ ์ต์์ ๋
ธ๋์ ๊ฐ์ ๋ฐํํ๋ค. ํธ๋ฆฌ ํํ๋ก ๊ตฌํ๋ Disjoint Set์์ ์ต์์ ๋
ธ๋๋ ๊ฐ ์งํฉ๊ณผ 1๋ 1 ๋์๋๋ฏ๋ก, Find ์ฐ์ฐ์ ํตํด ๊ฐ ์งํฉ์ ์ ์ ์๊ฒ ๋๋ค. ์ด ๊ณผ์ ์์ ์์ ์๊ฐ์ ๊ฐ๊น์ด ์ ๋์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ์๋ ค์ ธ ์๋ค.
2.2.1.1. Find ์ฐ์ฐ์ ์ต์ ํ[ํธ์ง]
Find ์ฐ์ฐ์ ์ํํ ๋๋ง๋ค ๋งค๋ฒ ํธ๋ฆฌ๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ๋ถ๋ช
ํ ๋ญ๋น์ด๋ค. ๋ง์ฝ ํธ๋ฆฌ์ ์์๊ฐ ํธ์ค๋์ด ์๋ค๋ฉด, ์๊ฐ๋ณต์ก๋๋ ์ ๊ทผ์ ํ๊ฒ ๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด์, Find ์ฐ์ฐ์์ ๋ฐฉ๋ฌธํ๋ ๊ฐ ๋
ธ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ธฐ ์ ์ ArrayList์ ํด๋น ์์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฝ๋ก๋ฅผ ์์ถํ๋ ํจ๊ณผ๊ฐ ์๋ค.
2.2.2. Union ์ฐ์ฐ[ํธ์ง]
Union ์ฐ์ฐ์ด ์ํ๋๋ฉด, ๋จผ์ Find ์ฐ์ฐ์ ์ํํ ํ ๋ ๊ฐ์ ์ต์์ ๋
ธ๋์ ๋ถ๋ชจ๋ฅผ ๋ค๋ฅธ ํ๋์ ์ต์์ ๋
ธ๋๋ก ๋ฐ๊พธ์ด ํธ๋ฆฌ๋ฅผ ๋ณํฉ์ํจ๋ค. ์ด ๊ณผ์ ์์ ์๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ Find ์ฐ์ฐ ๋ฟ์ด๋ฏ๋ก, ์๊ฐ๋ณต์ก๋๋ Find ์ฐ์ฐ๊ณผ ๋์ผํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
2.2.2.1. Union ์ฐ์ฐ์ ์ต์ ํ[ํธ์ง]
Union ์ฐ์ฐ์ ์ต์
์ ๊ฒฝ์ฐ์ ํธ๋ฆฌ๋ฅผ ํธ์ค์ํฌ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ArrayList๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ํธ๋ฆฌ์ ๋๋ต์ ์ธ ๊น์ด๋ฅผ ์ ์ฅํ๋ค. ์ด๊ฒ์ rank๋ผ๊ณ ํ๋ค. Union ์ฐ์ฐ์ ์ํํ ๋๋ rank๊ฐ ํฐ ํธ๋ฆฌ์ rank๊ฐ ์์ ํธ๋ฆฌ๋ฅผ ํฉ์น๋๋ก ๋ณ๊ฒฝํ๋ฉด ํธ๋ฆฌ์ ๊น์ด๋ฅผ ์ค์ด๋ ํจ๊ณผ๊ฐ ์๋ค.
3. ๊ตฌํ[ํธ์ง]
ArrayList list = []
Function additem():
list.append([list.length, 0])
Function find(index):
if list[index][0] == index:
return index
else:
return find(list[index][0])
Function union(a, b):
roota = self.find(a)
rootb = self.find(b)
list[roota][0] = list[rootb][0]