์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

1. ๊ฐœ์š”2. ์„ค๋ช…
2.1. ์›์‹œ์  ํ˜•ํƒœ2.2. ๊ธฐ๋ณธ์  ํ˜•ํƒœ
2.2.1. Find ์—ฐ์‚ฐ
2.2.1.1. Find ์—ฐ์‚ฐ์˜ ์ตœ์ ํ™”
2.2.2. Union ์—ฐ์‚ฐ
2.2.2.1. Union ์—ฐ์‚ฐ์˜ ์ตœ์ ํ™”
3. ๊ตฌํ˜„

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]