๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ( Dynamic Programming )
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋์ ๊ณํ๋ฒ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค
- ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ถ์ผ์์์ ๋์ (Dynamic)์ด๋ ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ์ง๊น?
- ์๋ฃ๊ตฌ์กฐ์์ ๋์ ํ ๋น(Dynamic Allocation)์ 'ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ค์ ์คํ์ ํ์ํ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ธฐ๋ฒ'์ ์๋ฏธํ๋ค - ๋ฐ๋ฉด์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ '๋ค์ด๋๋ฏน'์ ๋ณ๋ค๋ฅธ ์๋ฏธ ์์ด ์ฌ์ฉ๋ ๋จ์ด์ด๋ค
- ์๋ฃ๊ตฌ์กฐ์์ ๋์ ํ ๋น(Dynamic Allocation)์ 'ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ค์ ์คํ์ ํ์ํ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ค์์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ์ฌ์ฉํ ์ ์๋ค
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค
- ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblem)
- ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ค
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
- ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค
- ํ ๋ฒ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํ๋ ๊ธฐ๋ฒ์ด๋ค
- ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค
- ๊ฐ์ ๊ธฐ๋กํด ๋๋๋ค๋ ์ ์์ ์บ์ฑ(Caching) ์ด๋ผ๊ณ ๋ ํ๋ค
ํ๋ค์ด VS ๋ณดํ ์
- ํ๋ค์ด(๋ฉ๋ชจ์ด์ ์ด์ ) ๋ฐฉ์์ ํํฅ์์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๋ณดํ ์ ๋ฐฉ์์ ์ํฅ์์ด๋ผ๊ณ ๋ ํ๋ค
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ ํ์ ์ธ ํํ๋ ๋ณดํ
์
๋ฐฉ์์ด๋ค
- ๊ฒฐ๊ณผ ์ ์ฅ์ฉ ๋ฆฌ์คํธ๋ DP ํ ์ด๋ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค
- ์๋ฐํ ๋งํ๋ฉด ๋ฉ๋ชจ์ด์ ์ด์
์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ์์ ์ผ๋ก ๊ธฐ๋กํด ๋๋ ๋์ ๊ฐ๋
์ ์๋ฏธํ๋ค
- ๋ฐ๋ผ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตญํ๋ ๊ฐ๋ ์ ์๋๋ค
- ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋๊ธฐ๋ง ํ๊ณ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ํด ํ์ฉํ์ง ์์ ์๋ ์๋ค
ํผ๋ณด๋์น ์์ด: ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์์ค์ฝ๋ (Python)
# ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)ํ๊ธฐ ์ํ ๋ฆฌ์คํธ ์ด๊ธฐํ
d = [0] * 100
# ํผ๋ณด๋์น ํจ์(Fibonacci Function)๋ฅผ ์ฌ๊ทํจ์๋ก ๊ตฌํ (ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
def fibo(x):
# ์ข
๋ฃ ์กฐ๊ฑด(1 ํน์ 2์ผ ๋ 1์ ๋ฐํ)
if x == 1 or x == 2:
return 1
# ์ด๋ฏธ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ
if d[x] != 0:
return d[x]
# ์์ง ๊ณ์ฐํ์ง ์์ ๋ฌธ์ ๋ผ๋ฉด ์ ํ์์ ๋ฐ๋ผ์ ํผ๋ณด๋์น ๊ฒฐ๊ณผ ๋ฐํ
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
print(fibo(99))
ํผ๋ณด๋์น ์์ด: ๋ณดํ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์์ค์ฝ๋ (Python)
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ ์ด๊ธฐํ
d = [0] * 100
# ์ฒซ ๋ฒ์งธ ํผ๋ณด๋์น ์์ ๋ ๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1
d[1] = 1
d[2] = 1
n = 99
# ํผ๋ณด๋์น ํจ์(Fibonacci Function) ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ(๋ณดํ
์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
for i in range(3, n + 1):
d[i] = d[i - 1] + d[i - 2]
print(d[n])
ํผ๋ณด๋์น ์์ด: ๋ฉ๋ชจ์ด์ ์ด์ ๋์ ๋ถ์
- ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์น ๋ ๋ ธ๋๋ง ์ฒ๋ฆฌํ ๊ฒ์ ๊ธฐ๋ํ ์ ์๋ค
- ์ค์ ๋ก ํธ์ถ๋๋ ํจ์์ ๋ํด์๋ง ํ์ธํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฐฉ๋ฌธํ๋ค
- ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ๋ ๊ฒฝ์ฐ ํผ๋ณด๋์น ์์ด ํจ์์ ์๊ฐ ๋ณต์ก๋๋ O(N)
# ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)ํ๊ธฐ ์ํ ๋ฆฌ์คํธ ์ด๊ธฐํ
d = [0] * 100
# ํผ๋ณด๋์น ํจ์(Fibonacci Function)๋ฅผ ์ฌ๊ทํจ์๋ก ๊ตฌํ (ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
def fibo(x):
print('f(' + str(x) + ')', end=' ')
# ์ข
๋ฃ ์กฐ๊ฑด(1 ํน์ 2์ผ ๋ 1์ ๋ฐํ)
if x == 1 or x == 2:
return 1
# ์ด๋ฏธ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ
if d[x] != 0:
return d[x]
# ์์ง ๊ณ์ฐํ์ง ์์ ๋ฌธ์ ๋ผ๋ฉด ์ ํ์์ ๋ฐ๋ผ์ ํผ๋ณด๋์น ๊ฒฐ๊ณผ ๋ฐํ
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
fibo(6)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ VS ๋ถํ ์ ๋ณต
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ถํ ์ ๋ณต์ ๋ชจ๋ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉํ ์ ์๋ค
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ํฉ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ถํ ์ ๋ณต์ ์ฐจ์ด์ ์ ๋ถ๋ถ ๋ฌธ์ ์ ์ค๋ณต์ด๋ค
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์์๋ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น๋ฉฐ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋๋ค
- ๋ถํ ์ ๋ณต ๋ฌธ์ ์์๋ ๋์ผํ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋์ง ์๋๋ค
- ๋ถํ ์ ๋ณต์ ๋ํ์ ์ธ ์์์ธ ํต ์ ๋ ฌ์ ์ดํด๋ณด์
- ํ ๋ฒ ๊ธฐ์ค ์์(Pivot)๊ฐ ์๋ฆฌ๋ฅผ ๋ณ๊ฒฝํด์ ์๋ฆฌ๋ฅผ ์ก์ผ๋ฉด ๊ทธ ๊ธฐ์ค ์์์ ์์น๋ ๋ฐ๋์ง ์๋๋ค
- ๋ถํ ์ดํ์ ํด๋น ํผ๋ฒ์ ๋ค์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ ๋ฌธ์ ๋ ํธ์ถํ์ง ์๋๋ค
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
- ์ฃผ์ด์ง ๋ฌธ์ ๊ฐ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ ํ์์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค
- ๊ฐ์ฅ ๋จผ์ ๊ทธ๋ฆฌ๋, ๊ตฌํ, ์์ ํ์ ๋ฑ์ ์์ด๋์ด๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ๊ฒํ ํ ์ ์๋ค
- ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์ผ๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ณ ๋ คํด ๋ณด์
- ์ผ๋จ ์ฌ๊ท ํจ์๋ก ๋นํจ์จ์ ์ธ ์์ ํ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ค์ (ํ๋ค์ด) ์์ ๋ฌธ์ ์์ ๊ตฌํ ๋ต์ด
ํฐ ๋ฌธ์ ์์ ๊ทธ๋๋ก ์ฌ์ฉ๋ ์ ์์ผ๋ฉด, ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค - ์ผ๋ฐ์ ์ธ ์ฝ๋ฉ ํ ์คํธ ์์ค์์๋ ๊ธฐ๋ณธ ์ ํ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๊ฐ ์ถ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
์ถ์ฒ : https://freedeveloper.tistory.com/276