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

๋ชฉ๋ก์•Œ๊ณ ๋ฆฌ์ฆ˜ (19)

JUINTINATION

์œ„์ƒ์ •๋ ฌ(Topological Sort)

์œ„์ƒ์ •๋ ฌ(Topological Sort)์ด๋ž€? ์œ ํ–ฅ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„(DAG, Directed Acyclic Graph)์—์„œ ์ •์ ์„ ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ๋‚˜์—ดํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์Œ ๋ผ๋ฉด ๋“์ด๊ธฐ ์˜ˆ์ œ๋ฅผ ๋ณด์ž ์šฐ๋ฆฌ๋Š” ๋ผ๋ฉด์„ ๋“์ผ ๋•Œ ๋ƒ„๋น„์— ๋ฌผ์„ ๋จผ์ € ๋ถ€์–ด๋„ ๋˜๊ณ  ๋ผ๋ฉด ๋ด‰์ง€๋ฅผ ๋จผ์ € ๋œฏ์–ด๋„ ๋˜์ง€๋งŒ ๊ณ„๋ž€์€ ๋งจ ๋งˆ์ง€๋ง‰์— ํ’€์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉํ–ฅ์€ ์žˆ์ง€๋งŒ ์‚ฌ์ดํด์€ ์—†๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๊ณ  ํ•œ ์ค„๋กœ ์ •๋ ฌ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์œ„์ƒ์ •๋ ฌ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(1) ์ง„์ž… ๊ฐ„์„ ์ด ์—†๋Š” ์ •์ ์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ R์˜ ๋งจ ๋’ค์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ•ด๋‹น ์ •์ ๊ณผ ๊ทธ ์ •์ ์˜ ์ง„์ถœ ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์˜์‚ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ๊ทธ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. topological_so..

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

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

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(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}์ด..

๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(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_..

๋™์  ๊ณ„ํš๋ฒ•(dynamic programming)

๋™์  ๊ณ„ํš๋ฒ•(dp)์ด๋ž€? ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ• ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• ๋™์  ๊ณ„ํš๋ฒ•์˜ ์กฐ๊ฑด ์–ด๋–ค ๋ฌธ์ œ(problem)๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ(sub problem)๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š” ๊ฒฝ์šฐ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์˜ ๋‹ต์œผ๋กœ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์ด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ ๋™์  ๊ณ„ํš๋ฒ•์˜ ์˜ˆ์‹œ dp๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๋ฌธ์ œ ์ค‘์— ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค. fib(n) { if (n = 0) then return 0; else if (n = 1) then return 1; else return (fib(n - 1) + fib(n - 2)); } ์ด ๋ฌธ์ œ๋Š” ์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜..