๐ Algorithm/Tip
[Python] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (DP)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ์ ํ์๊ณผ memoization ์ด๋ค. DP๋ ์ฃผ๋ก bottom-up ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ง, top-down์ผ๋ก๋ ๊ตฌํ ๊ฐ๋ฅํ๋ค. top-down์ ์ฌ๊ท+memoization์ ํตํด ๊ตฌํํ๋ค. ๋ํ์ ์ธ DP๋ฌธ์ ๋ก, ํผ๋ณด๋์น ์์ด์ด ์๋ค. https://www.acmicpc.net/problem/2748 2748๋ฒ: ํผ๋ณด๋์น ์ 2 ํผ๋ณด๋์น ์๋ 0๊ณผ 1๋ก ์์ํ๋ค. 0๋ฒ์งธ ํผ๋ณด๋์น ์๋ 0์ด๊ณ , 1๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1์ด๋ค. ๊ทธ ๋ค์ 2๋ฒ์งธ ๋ถํฐ๋ ๋ฐ๋ก ์ ๋ ํผ๋ณด๋์น ์์ ํฉ์ด ๋๋ค. ์ด๋ฅผ ์์ผ๋ก ์จ๋ณด๋ฉด Fn = Fn-1 + Fn-2 (n ≥ 2)๊ฐ www.acmicpc.net ๐ ํผ๋ณด๋์น ์์ ์ ํ์์ f(n) = f(n-1) + f(n-2) (n>=2) ๐ Bottom-Up ..
[Python] ์ต์ํ(MIN heap) / ์ต๋ํ(MAX heap)
ํ์ ์๋ฃ๊ตฌ์กฐ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค. ํธ๋ฆฌ ์ค์์๋ ์์ ์ด์งํธ๋ฆฌ์ด๋ค. ์ต๋ ํธ๋ฆฌ๋ ํญ์ ๋ถ๋ชจ๊ฐ ์์๋ณด๋ค ๊ฐ์ด ํฌ๋ค. ์ต์ ํธ๋ฆฌ๋ ํญ์ ๋ถ๋ชจ๊ฐ ์์๋ณด๋ค ๊ฐ์ด ์๋ค. (์์๋ผ๋ฆฌ๋ ์๊ดX) python์ผ๋ก ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ๊ฐ? ๊ณ ๋ฏผํ ํ์ ์์ด module์ ์ฐ๋๋ก ํ๊ฒ ๋ค. ์ต์(Min) heap python์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ heap์ ๊ตฌํํ ์ ์๋ ๋ชจ๋์ ์ ๊ณตํ๋ค. import heapq heap์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ์๋๊ณ , ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ heap์ผ๋ก ๋ง๋ค ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ ๋ ฌ๋์ง ์์ arr ๋ฐฐ์ด์ heapify๋ก ์ ๋ ฌํ ์ ์๋ค. heapify(์ ๋ ฌํ ๋ฆฌ์คํธ) import heapq arr = [1,5,3,6,2] heapq.heapify(arr) print(arr) # [1,2,3,6,5..
[Algorithm] LCA ์๊ณ ๋ฆฌ์ฆ
LCA๋ "Lowest Common Ancestor" ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ฐฑ์ค 3584๋ฒ์ ํ๋ฉด์ ์ดํดํด๋ณด์ฅ www.acmicpc.net/problem/3584 3584๋ฒ: ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์ ๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ(rooted tree)๊ฐ ์ฃผ์ด์ง๊ณ , ๊ทธ ํธ๋ฆฌ ์์ ๋ ์ ์ ์ด ์ฃผ์ด์ง ๋ ๊ทธ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์(Nearest Common Anscestor)์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค. ๋ ๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์, ๋ www.acmicpc.net ํด๋น ํธ๋ฆฌ์์ 3๋ฒ๊ณผ 2๋ฒ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ์กฐ์์ 10๋ฒ์ด๋ผ๋ ๊ฒ์ ๋ฐ๋ก ์ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด a์b๊ฐ ์ฃผ์ด์ก์ ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ๊ณตํต ์กฐ์์ ์ฐพ์๋ณด์. Rule ๐ a์ ์กฐ์์ ๋ชจ๋ ์ฐพ์ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค. ๐ b์ ์กฐ..
[Algorithm] Dijkstra ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ A์์ B๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ๋จผ์ , ์๊ณ ๋ฆฌ์ฆ์ ์ง๊ด์ ์ผ๋ก ์ดํด๋ณด์ ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ์์ A->C๋ก ๊ฐ๊ณ ์ ํ ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด๋ณด์. ์ฐ์ ์ถ๋ฐ์ง๋ก๋ถํฐ ์ธ์ ํ ๋ ธ๋๋ค๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค. (๋นจ๊ฐ์) ๊ทธ ๋ค์ ๋ ธ๋๋ก ์ด๋ํ๋ค. ํด๋น ๋ ธ๋์์ ์ธ์ ํ ๋ ธ๋๋ค ์ค์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค. ๋ค์๊ณผ ๊ฐ์ด D์ ๊ฑฐ๋ฆฌ๊ฐ 5์์ 3์ผ๋ก ๊ฐฑ์ ๋์๋ค. (์ต๋จ ๊ฑฐ๋ฆฌ) C๊ฐ 5์์ 4๋ก ๊ฐฑ์ ๋์๋ค. ํ์ฌ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ๋์ฐฉ์ง๋ผ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฃํ๋ค. ๊ทธ๋ฆผ์ฒ๋ผ A->C์ ์ต๋จ๊ฒฝ๋ก๋ 4๊ฐ ๋๋ค. ์์ ๊ฐ์ด ๋์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๐ Rule 1. ์ถ๋ฐ ๋ ธ๋๋ก๋ถํฐ ์ธ์ ํ ๋ ธ๋๋ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค. 2. ๋ค์ ๋ ธ๋๋ก ๋ฐฉ๋ฌธํ์ฌ ์ธ์ ๋ ธ๋..
[Algorithm] ๋๋น ์ฐ์ ํ์ BFS / ๊น์ด ์ฐ์ ํ์ DFS
๊ฐ์ธ์ ์ผ๋ก ์ด๋ ค์ ํ๋ ์๊ณ ๋ฆฌ์ฆ,, ์๊ณ ๋ฆฌ์ฆ BFS๋ FIFO๋ฅผ ์์น์ผ๋ก ํ๋ Queue๋ก ๊ตฌํํ๋ค. ํ์์ ์์ํ๋ ์ฒซ ๋ ธ๋(root)๋ฅผ queue์ ๋ฃ๊ณ ํ์์ ์์ํ๋ค. A. queue์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค. B. ๊บผ๋ธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ queue์ ๋ฃ๋๋ค. queue์ ๋ ธ๋๊ฐ ์์ด์ง ๋ ๊น์ง AB๋ฐ๋ณต ๊ตฌํ def bfs(graph, root): visit = list() queue = [root] #AB๋ฐ๋ณต while queue: temp = queue.pop(0) if temp not in visit: print(temp) visit.append(temp) queue.extend(graph[temp]) ์๊ณ ๋ฆฌ์ฆ DFS๋ LIFO๋ฅผ ์์น์ผ๋ก ํ๋ Stack์ผ๋ก ๊ตฌํ..