๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก์ž๋ฃŒ๊ตฌ์กฐ (9)

JUINTINATION

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(Minimum Spanning Tree)

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(MST)๋ž€? ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด ์—†์ด ๋ชจ๋“  ์ ๋“ค์„ ์—ฐ๊ฒฐ์‹œํ‚จ ํŠธ๋ฆฌ๋“ค ์ค‘ ์„ ๋ถ„๋“ค์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ ์ฆ‰, ์–ด๋–ค ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์˜ ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘ ์„ ๋ถ„๋“ค์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด ์—†์ด ๋ชจ๋“  ์ ๋“ค์„ ์—ฐ๊ฒฐ์‹œํ‚จ ํŠธ๋ฆฌ๋กœ ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์˜ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ์‚ฌ์ดํด์ด ์—†๋„๋ก ๋ชจ๋“  ์ ์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋ฉด ๋œ๋‹ค. ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด ์—†์ด ๋ชจ๋“  ์ ๋“ค์„ ์—ฐ๊ฒฐ์‹œํ‚จ ํŠธ๋ฆฌ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์ ์ด n๊ฐœ ์žˆ๋‹ค๋ฉด ์‹ ์žฅ ํŠธ๋ฆฌ์—๋Š” n-1๊ฐœ์˜ ์„ ๋ถ„์ด ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ ์™ผ์ชฝ ๊ทธ๋ฆผ์˜ ๊ทธ๋ž˜ํ”„์˜ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์˜ ๊ทธ๋ž˜ํ”„์™€ ๊ฐ™๋‹ค. MST๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Kruskal's Algorithm)๊ณผ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ..

ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table)

ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋ž€? ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ํ‚ค ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ํ•ด์‹œ ๊ฐ’์„ ์–ป์–ด ๊ทธ๊ฒƒ์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์›์†Œ๊ฐ€ ์ €์žฅ๋  ์ž๋ฆฌ๊ฐ€ ์›์†Œ์˜ ๊ฐ’์— ์˜ํ•ด ๊ฒฐ์ •๋จ ๋งค์šฐ ๋น ๋ฅธ ์‘๋‹ต์„ ์š”ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋จ ex) ์ฃผ๋ฏผ ๋“ฑ๋ก ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ ๋ฒˆํ˜ธ ๊ด€๋ จ ๊ฒ€์ƒ‰ ํ•ด์‹œ ํ•จ์ˆ˜ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์ž…๋ ฅ ํ‚ค๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ํ•ด์‹œ ๊ฐ’์„ ์–ป์—ˆ์„ ๋•Œ ์ž…๋ ฅ ์›์†Œ๊ฐ€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๊ณจ๊ณ ๋ฃจ ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ณ„์‚ฐ์ด ๊ฐ„๋‹จํ•ด์•ผ ํ•˜๋ฉฐ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋ฐฉ๋ฒ•๊ณผ ๊ณฑํ•˜๊ธฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋‚˜๋ˆ„๊ธฐ ๋ฐฉ๋ฒ•(Division Method) h(x) = x mod m m: ํ•ด์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์ด์ฆˆ, ๋ณดํ†ต ์†Œ์ˆ˜๋กœ ์ง€์ • ๊ณฑํ•˜๊ธฐ ๋ฐฉ๋ฒ•(Multiplication Method) h(x) = (xA mod 1) * m A: 0

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union-Find)

์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint Set)์ด๋ž€? ๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ๋‘ ์ง‘ํ•ฉ, ์ฆ‰ A∩B=∅์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋‘ ์ง‘ํ•ฉ A, B๋ฅผ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union-Find)๋ž€? ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์‰ฌ์šด ์ดํ•ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. https://www.acmicpc.net/problem/1717 1717๋ฒˆ: ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ์ดˆ๊ธฐ์— $n+1$๊ฐœ์˜ ์ง‘ํ•ฉ $\{0\}, \{1\}, \{2\}, \dots , \{n\}$์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ๊ณผ, ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘ www.acmicpc.net ์œ„์˜ ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ดˆ๊ธฐ์— n+1๊ฐœ์˜ ์ง‘ํ•ฉ {0}, {1}, {2}, ... , {n}์ด..

ํž™(Heap)๊ณผ ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)

ํž™์ด๋ž€? ์ตœ๋Œ“๊ฐ’ ๋ฐ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๊ฐ–๋Š” ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ A๊ฐ€ B์˜ ๋ถ€๋ชจ๋…ธ๋“œ(parent node) ์ด๋ฉด, A์˜ ํ‚ค(key)๊ฐ’๊ณผ B์˜ ํ‚ค๊ฐ’ ์‚ฌ์ด์—๋Š” ๋Œ€์†Œ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค. ํž™์—๋Š” ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์ตœ๋Œ€ ํž™: ๋ถ€๋ชจ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ํฐ ํž™ ์ตœ์†Œ ํž™: ๋ถ€๋ชจ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ์ž‘์€ ํž™ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š” ์ž์‹๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 2๊ฐœ์ธ ์ด์ง„ ํž™(binary heap)์„ ์‚ฌ์šฉ ๊ฐ€์žฅ ๋†’์€(ํ˜น์€ ๊ฐ€์žฅ ๋‚ฎ์€) ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ๋ฃจํŠธ ๋…ธ๋“œ์— ์˜ค๊ฒŒ ๋˜๋Š” ํŠน์ง•์ด ์žˆ์Œ ์ด๋ฅผ ์‘์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ์™€ ๊ฐ™์€ ์ถ”์ƒ์  ์ž๋ฃŒํ˜•์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํž™์˜ ์ฃผ์š” ์—ฐ์‚ฐ ์ตœ์†Œ ํž™์„ ๊ธฐ์ค€์œผ๋กœ ํž™์˜ ์ฃผ์š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ..

ํŠธ๋ฆฌ(Tree)

ํŠธ๋ฆฌ๋ž€? ๊ณ„์ธต์ (Hierarchical)์ธ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ ๋‚˜๋ฌด๋ฅผ ๋’ค์ง‘์–ด๋†“์€ ๋ชจ์–‘๊ณผ ๋‹ฎ์•˜๋‹ค๊ณ  ํ•ด์„œ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ๋…ธ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ex) Decision Tree(์˜์‚ฌ ๊ฒฐ์ • ํŠธ๋ฆฌ) in AI ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ ๋“ฑ์€ ์„ ํ˜• ๊ตฌ์กฐ ํŠธ๋ฆฌ ์šฉ์–ด ๋…ธ๋“œ(node): ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ์š”์†Œ ๋ฃจํŠธ(root): ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ(A) ์„œ๋ธŒํŠธ๋ฆฌ(subtree): ํ•˜๋‚˜์˜ ๋…ธ๋“œ์™€ ๊ทธ ๋…ธ๋“œ๋“ค์˜ ์ž์†๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ ๋‹จ๋ง๋…ธ๋“œ(terminal node): ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ ๋น„๋‹จ๋ง๋…ธ๋“œ(leaf node): ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ž์‹์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ ๋ ˆ๋ฒจ(level): ํŠธ๋ฆฌ์˜ ๊ฐ์ธต์˜ ๋ฒˆํ˜ธ ๋†’์ด(height): ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋ ˆ๋ฒจ ์ฐจ์ˆ˜(degree): ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ A๋Š” ๋ฃจํŠธ ๋…ธ๋“œ์ด๋‹ค. B๋Š” ..

๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS)๊ณผ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)

๊ทธ๋ž˜ํ”„(Graph)๋ž€? ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๊ทธ๋ž˜ํ”„ G๋Š” (V, E)๋กœ ํ‘œ์‹œ ์ •์ (vertices) ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŠน์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ๋…ธ๋“œ(node)๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ ๊ฐ„์„ (edge) ์ •์ ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„ ๋งํฌ(link)๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ DFS๋ž€? ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(depth-first search)ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฐ€๋‹ค๊ฐ€ ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฐˆ๋ฆผ๊ธธ๋กœ ๋Œ์•„์™€์„œ ์ด ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰ ์ง„ํ–‰ ์Šคํƒ(Stack)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ # ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ DFS depth_first_search(v): v๋ฅผ ๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œ; for all u ∈ (v์— ์ธ์ ‘ํ•œ ์ •์ ) do if (u๊ฐ€ ์•„์ง ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์•˜์œผ๋ฉด) then depth_first_..