โญ 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. ์ด์ 1 ๋ค์