๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โญ Personal_Study/Algorithm4

Segment Tree Segment Tree Segment Tree๋ž€? โœ” ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ, ํŠน์ • ๊ตฌ๊ฐ„์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ตฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ! โœ” prefix sum? -> ์œ ์šฉํ•˜์ง€๋งŒ ๊ฐ’์˜ ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋‹ค โœ” ๋”ฐ๋ผ์„œ segment tree๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค! โœ” ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ฐ’์„ ์ตœ๋Œ€๋กœ ์ปค๋ฒ„ํ•˜๋Š” ๋ฒ”์œ„์˜ segment๋“ค์„ ๋”ํ•ด์„œ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค โœ” ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ์— ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— logN ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค! ์ „์ฒด ์ฝ”๋“œ (์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„) from math import log2, ceil, gcd class SegmentTree: def __init__(self, input_list, calculation_method='sum'): self.level = 0 self.. 2022. 12. 3.
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ต์ŠคํŠธ๋ผ (Dijkstra) ๋‹ค์ต์ŠคํŠธ๋ผ (Dijkstra) ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ โœ” ์Œ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์˜ ํ•œ ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ * P[a][b]: a์™€ b ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ์ถœ๋ฐœ์ ์œผ๋กœ๋ถ€ํ„ฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด distance[v]์„ ๋งŒ๋“ค๊ณ  ์ถœ๋ฐœ ๋…ธ๋“œ๋Š” 0, ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค์€ ์ถฉ๋ถ„ํžˆ ํฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. ํ˜„์žฌ ๋…ธ๋“œ Current๋ฅผ ์ถœ๋ฐœ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋กœ ์„ค์ •ํ•œ๋‹ค. Current๋กœ๋ถ€ํ„ฐ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋…ธ๋“œ Next์— ๋Œ€ํ•ด distance[Current] + P[Current][Next](A๋ฅผ ๊ฑฐ์ณ์„œ B๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ)์™€ distance[Next](ํ˜„์žฌ๊นŒ์ง€ ์•Œ๋ ค์ง„ B์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ)์˜ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ์งง์€ ๊ฐ’(์งง์€ ๊ฒฝ๋กœ)๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. Current์˜ ๋ชจ๋“  ์ด์›ƒ๋…ธ๋“œ N.. 2022. 10. 1.
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (MST) ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (MST) ์‹ ์žฅ ํŠธ๋ฆฌ (Spanning Tree) โœ” ๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๋ชจ๋“  ์ •์ ์„ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ โœ” ๊ทธ๋ž˜ํ”„์˜ ์ตœ์†Œ ์—ฐ๊ฒฐ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„ (N - 1)๊ฐœ์˜ ๊ฐ„์„  -> ํŠธ๋ฆฌ ํ˜•ํƒœ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ (Minimum spanning Tree) โœ” Spanning Tree ์ค‘์—์„œ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ(Minimun)์ธ ํŠธ๋ฆฌ โœ” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์ผ ์ˆ˜ ์žˆ๋‹ค. MST ๊ตฌํ˜„ - ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ โœ” Greedy๋ฅผ ์ด์šฉํ•ด ๊ฐ ๋‹จ๊ณ„์—์„œ ์‚ฌ์ดํด์„ ์ด๋ฃจ์ง€ ์•Š๋Š” ์ตœ์†Œ ๋น„์šฉ ๊ฐ„์„ ์„ ์„ ํƒํ•œ๋‹ค. ๋™์ž‘ ์ˆœ์„œ ๊ฐ„์„ ์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. (์ตœ์†Œ ๋น„์šฉ) ์ •๋ ฌ๋œ ๊ฐ„์„  ๋ฆฌ์ŠคํŠธ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฐ„์„ ์„ ์„ ํƒํ•œ๋‹ค. (Union - Find ์ด์šฉ: Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?!) ์„ ํƒํ•œ ๊ฐ„์„ ์„ ํ˜„์žฌ .. 2022. 9. 29.
[์•Œ๊ณ ๋ฆฌ์ฆ˜] Union-Find ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ โœ” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint Set) โœ” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•  ๋•Œ , ์ž„์˜์˜ ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์— ์†ํ•ด์žˆ๋Š”์ง€ ํŒ๋ณ„ Union & Find Find ๋…ธ๋“œ x๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ์—ฐ์‚ฐ def find_parent(parent, current): if parent[current] != current: return find_parent(parent, parent[current]) return current Union ๋…ธ๋“œ x๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ๊ณผ ๋…ธ๋“œ y๊ฐ€ ํฌํ•จ๋œ ๋‘ ์ง‘ํ•ฉ์„ ํ†ตํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ def union_parent(parent, x, y): x = find_parent(parent, x) y = find_parent(parent, y) # ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์—์„œ๋Š” ์ž‘์€ ์ชฝ์œผ๋กœ ํ•ฉ์นœ๋‹ค.. 2022. 9. 28.