1. Dynamic_Programming ์ด๋
- ํฐ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ ๋ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์์ฌํญ : ์ฌ๊ทํจ์๋ก ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํ์ ์ฌ๊ทํจ์๋ฅผ ์ ์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์์๋ค.
๋ฐ๋ผ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์๋ ์ฌ๊ทํจ์๋ณด๋ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ค.
ํผ๋ณด๋์น ์์ด์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ๋ฌธ์ ์ด๋ค. ํ๋ณด๋์น๋ฅผ ํตํด ๋ค์ด๋๋ฏน ํจ์๋ฅผ ์ดํดํด๋ณด์.
2. ์์์ฝ๋(์ฌ๊ทํจ์ ์ฌ์ฉ)
d = [0] * 100 # ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
(memoization)ํ๊ธฐ ์ํ ๋ฆฌ์คํธ ์ด๊ธฐํ
def fibo(x): # ํผ๋ณด๋์น ์์ด์ ์ฌ๊ทํจ์๋ก ๊ตฌํ(ํ ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
if x == 1 or x == 2: # ์ข
๋ฃ ์กฐ๊ฑด : x = 1 ๋๋ 2์ผ๋ 1์ ๋ฐํ
return 1
if d[x] != 0: # ๋ง์ฝ d[x]๊ฐ 0์ด ์๋๋ผ๋ฉด (= ํ๋ฒ ๊ณ์ฐ๋ ๋ฌธ์ ๋ผ๋ฉด, (ํผ๋ณด๋์น๋ f(5) = f(4) + f(3) = (f(3)+f(2)) + (f(2)+f(1)) ์ด๋ฐ์์ผ๋ก ์ฐ์๋ f(x)๊ฐ ๊ณ์์ฐ์ด๊ธฐ ๋๋ฌธ์))
return d[x] # ๊ณ์ฐ๋์๋ ๊ฐ ๊ทธ๋๋ก ๋ฐํ
d[x] = fibo(x - 1) + fibo(x - 2) # ๋ง์ฝ ๊ณ์ฐ๋์ ์๋ ๊ฐ์ด๋ผ๋ฉด ์ฌ๊ทํจ์๋ก ํผ๋ณด๋์น๊ฐ ๋ฐํ (top-down ๋ฐฉ์)
return d[x]
print(fibo(99))
2. ์์์ฝ๋2(๋ฐ๋ณต๋ฌธ์ฌ์ฉ)
d = [0] * 100 # ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ธฐ ์ํ ๋ฆฌ์คํธ๋ก ๊ตฌํ๊ณ ์ถ์ ํผ๋ณด๋์น์ ํฌ๊ธฐ
d[1] = 1
d[2] = 1
n = 99
for i in range(3, n + 1): # fibonacci function ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ(bottom-up ๋ฐฉ์)
d[i] = d[i - 1] + d[i - 2]
print(d[n])