ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฆ ๋์ ๊ณํ๋ฒ (Dynamic Programming, DP)
๋์ ๊ณํ๋ฒ์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ฌธ์ (sub-problem)์ผ๋ก ๋๋์ด ํธ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์ ํ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ ์ด ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ์ฌ ํ ๋ฒ์ฉ๋ง ๊ณ์ฐํ๋๋ก ํ๋ฉฐ
์ด๋ฌํ ๊ธฐ๋ฒ์ memoization์ด๋ผ๊ณ ํ๋ค.
๐ ๋ฌธ์ ๋ฅผ ํ ๋ ์ ํ์๊ณผ ํจ์ ํธ์ถ ๊ณผ์ ์ ์๊ฐํด๋ณด๋ฉด์ dp ํ ์ด๋ธ์ ์ฑ์๋๊ฐ๋ฉด ๋๋ค.
๐ ๋ํ ๊ฐ๋ฅํ๋ฉด ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๋ ํ ๋ค์ด ๋ฐฉ์๋ณด๋ค๋ ๋ณดํ ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์์คํ ์ ์ฌ๊ท ํจ์์ ์คํ ํฌ๊ธฐ๊ฐ ํ์ ๋์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- dp ํ ์ด๋ธ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉ๋๋ ๊ฒฐ๊ณผ ์ ์ฅ์ฉ ๋ฐฐ์ด/๋ฆฌ์คํธ
→ ํ ๋ฒ ๊ตฌํ ๊ฒฐ๊ณผ๋ ๊ณ์ํด์ ๋ฐฐ์ด/๋ฆฌ์คํธ์ ์ ์ฅํ๊ณ ๊ทธ๊ฒ์ ์ด์ฉํ์ฌ ๊ทธ ๋ค์ ๊ฐ์ ๊ตฌํด๋๊ฐ๋ค.
๐ฆ Top-Down
์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ฌ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ค์ ํธ์ถํ๋ค.
ํผ๋ณด๋์น ์ ๊ตฌํ๊ธฐ (Top-Down)
dp = [0] * 100
def fibo(x):
if x == 0:
return 0
elif x == 1:
return 1
if dp[x] != 0:
return dp[x]
dp[x] = fibo(x - 1) + fibo(x - 2)
return dp[x]
print(fibo(99))
๐ฆ Bottom-Up
๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ต์ ๋์ถํ๋ค.
ํผ๋ณด๋์น ์ ๊ตฌํ๊ธฐ (Bottom-Up)
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ
dp = [0] * 100
# ์ฒซ๋ฒ์งธ ํผ๋ณด๋์น ์์ ๋๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1
dp[0] = 0
dp[1] = 1
n = 99
# ํผ๋ณด๋์น ํจ์ ๊ตฌํ
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2] # ํผ๋ณด๋์น ํจ์์ ์ ํ์
print(dp[n])
๐ฆ 796,796์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ผ.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์์๋ ์ข ์ข ๊ฒฐ๊ณผ๋ฅผ ์ด๋ค ์๋ก ๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ผ๋ ๋ด์ฉ์ด ๋ค์ด๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด๋ ๋จ์ง ๊ฒฐ๊ด๊ฐ์ด ๊ต์ฅํ ์ปค์ง ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๊ฒ์ผ๋ก, ๊ฐ์ ๊ณ์ฐํ ๋๋ง๋ค ํน์ ํ ์๋ก ๋๋ ๋๋จธ์ง๋ง ์ทจํ๋๋ก ํ๋ฉด ๋๋ค.
for i in range(3, n + 1):
d[i] = (d[i - 1] + 2 * d[i - 2]) % 796796
๐ ๋ง์ง๋ง์ ์ต์ข ๊ณ์ฐ๋ ๊ฒฐ๊ณผ์์ ๋๋๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๊ณ์ฐํ ๋๋ง๋ค ๋๋๋ค๋ ์ ์ ์ฃผ์ํ์!!
Ref.
์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ - YES24
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ๋ฐฑ์ค - if๋ฌธ (0) | 2021.03.29 |
---|---|
[JAVA] ๋ฐฑ์ค - ์ ์ถ๋ ฅ๊ณผ ์ฌ์น์ฐ์ฐ (0) | 2021.03.29 |
[CS/์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์ (Binary Search) (0) | 2021.03.07 |
[Algorithm] ํ์ : ๊น์ด ์ฐ์ ํ์ (DFS), ๋๋น ์ฐ์ ํ์ (BFS) (0) | 2021.03.02 |
ํ๋ก๊ทธ๋๋จธ์ค - SQL : String, Date (MySQL) (0) | 2021.02.25 |