dynamic_programming
Dynamic programming
์ปดํจํฐ๋ฅผ ์ด์ฉํด๋ ์๊ฐ์ด ๋งค์ฐ ๋ง์ด ํ์ํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋งค์ฐ ๋ง์ด ํ์ํ๋ฉด ํด๊ฒฐํ๊ธฐ ์ด๋ ต๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฝ๊ฐ ๋ ์ฌ์ฉํ๋ฉด, ์ฐ์ฐ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ์ฆ๊ฐ์ํฌ ์ ์๊ณ , ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ. ๋์ ๊ณํ๋ฒ์ด๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋์ ํ ๋น์ ๋ค์ด๋๋ฏน์ ๊ฐ์ ์๋ฏธ์ผ๊น?
๋ค์ด๋๋ฏน ์ฌ์ฉ์กฐ๊ฑด
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค.
์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ๋ค.
์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ํ ๋ฌธ์ : ํผ๋ณด๋์น
O(2^N) ์ ๊ณ์ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ 100 ๋ง ๋๋๋ผ๋ ์๋ฐฑ์ต๋ ์ด ๊ฑธ๋ฆฐ๋ค.
Memoization (Top - Down)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ ์ข ๋ฅ. ํ ๋ฒ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋๊ฐ์ ๋ด์๋๋ ๊ฒ์ ์๋ฏธ
ํ ๋ฒ ๊ตฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํด๋๊ณ ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ด
์บ์ฑ (Caching) ์ด๋ผ๊ณ ๋ ํจ
Implementation
ํ ๋ฒ ๊ตฌํ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅ. ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ค๊ฐ ๊ฐ์ ์ ๋ณด๊ฐ ํ์ํ ๋ ์ด๋ฏธ ๊ตฌํ ์ ๋ต์ ๋ฆฌ์คํธ์์ ๊ฐ์ ธ์ด
ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถ
๋์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์๋ฃํ, ์๋ฅผ ๋ค์ด ์ฌ์ (dict) ์๋ฃํ์ ์ด์ฉํ ์๋ ์๋ค. ์์ด์ฒ๋ผ ์ฐ์์ ์ด์ง ์์ ๊ฒฝ์ฐ ์ ์ฉํจ.
Bottom - Up
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ ํ์ ์ธ ํํ
๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ต์ ๋์ถ
LIS (๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด)
D[i]: a[i] ๋ก ๋๋๋ ๊ฐ์ฅ ๊ธด ์์ด
LCS (์ต์ฅ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด)
ํ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ํ๋์ฉ ํด๋๊ฐ
String1[i] == String2[j] ๋ผ๋ฉด [i, j] = [i - 1, j - 1] + 1
String1[i] != String2[j] ๋ผ๋ฉด [i, j] = [i - 1, j] ์ [i, j - 1] ์ค ํฐ ๊ฒ
Knapsack Problem
2์ฐจ์ DP ๋ก ๋งค ์๊ฐ ๋ค์ด์ค๋ ๋ฌผ๊ฑด์ ๋ฐ๋ผ ์๋ก์ด ํ์ ์ฑ์๋๊ฐ๋ณด์
ํธ์ง๊ฑฐ๋ฆฌ
etc
๋๋ถ๋ถ DP ํต์ฌ์, ๋งค ๋ฒ๋ง๋ค ์ต์ ์๊ฒ ์ ํํด๊ฐ๋ ๊ฒ์ด๋ ๋น๊ต๋์ ์ ์ ๊ฒ์ฆํ์
์์ ๊ฒฝ์ฐ์ ์ด๋ค ํด๊ฐ ์ ์ฉ๋๋์ง ์ ๋ณด์
DP ํ ์ด๋ธ
ํ ์ด๋ธ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง, ๋ช ์ฐจ์
ํ, ์ด์ ์ด๋ป๊ฒ ์ ํ ์ง
์ด์ ์ ๊ฐ์ ์ด๋ป๊ฒ ์ฐธ๊ณ ํด์ ํ์ฌ๊ฐ์ ๊ฒฐ์ ํ๋์ง
์ฝํ ์์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋์ฒด๋ก ๊ฐ๋จํ ํํ๋ก ์ถ์ ๋๋ค.
์ฃผ์ด์ง ๋ฌธ์ ๊ฐ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ ํ์ธ์ง ํ์ ํ์
๋ฌธ์ ์์ ์์ ๋ฌธ์ ์ ์ ๋ต์ด ์ด ์์ ๋ฌธ์ ๋ฅผ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ ๊ฒ์ธ์ง ํ์ ์ด ์ค์
๊ทผ๋ฐ ์ด๊ฑด ๋ณดํ ์ ๋ฐฉ์์ผ๋ก 0, 1, 2 ๋ฅผ ํ๋ค๋ณด๋ฉด ๊ท์น์ด ๋ณด์ด๊ณ , ์ค๋ณต๋๋๊ฑธ ์ฌ์ ์ ๋ฐฉ์งํ๊ธฐ ์์ฝ๋ค.
์ผ๋จ ์ฌ๊ทํจ์๋ก ์์ฑํ๊ณ , ์์ ๋ฌธ์ ์์ ๊ตฌํ ๋ต์ด ํฐ ๋ฌธ์ ์์ ๊ทธ๋๋ก ์ฌ์ฉ๋๋ค๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์ฉ
๊ฐ๋ฅํ๋ค๋ฉด ๋ณดํ ์ ๋ฐฉ์์ ๊ถ์ฅ
recursion depth ์ค๋ฅ๊ฐ ๋ ์ ์๋ค
Sys.setrecursionlimit() ๋งค์๋ ํธ์ถํ์ฌ ์ํํ ์ ์์
Last updated