ํฐ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋๊ณ , ๊ฐ์ ๋ฌธ์ ๋ผ๋ฉด ํ ๋ฒ์ฉ๋ง ํ์ด ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ๋ ์ด์
1. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ ์ฌ์ฉํ๋๋ผ๋, ์ฐ์ฐ ์๋๋ฅผ ์ฆ๊ฐ์ํค๊ธฐ ์ํด
2. ์ค๋ณต๋๋ ์ฐ์ฐ์ ์ค์ด๊ธฐ ์ํด
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ ์กฐ๊ฑด
1. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๋
2. ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์
- ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ ๋
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ๊ทผ ๋ฐฉ๋ฒ
- ๊ทธ๋ฆฌ๋, ๊ตฌํ, ์์ ํ์ ๋ฑ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ง ๊ฒํ ํ ํ ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ณ ๋ คํด๋ณธ๋ค.
- ์ฌ๊ท ํจ์๋ก ์์ฑํด๋ณธ ํ, ์์ ๋ฌธ์ ์์ ๊ตฌํ ๋ต์ด ํฐ ๋ฌธ์ ์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด bottom - up ๋ฐฉ์์ ๊ณ ๋ คํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
: ํ ๋ฒ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํ๋ ๊ธฐ๋ฒ
- ์ด์ ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ์์ ์ผ๋ก ๊ธฐ๋กํด ๋๋ ๊ฐ๋
- ๊ธฐ๋ก๋ง ํด๋๊ณ ํ์ฉํ์ง ์์ ์๋ ์์
- ์บ์ฑ(Caching)์ด๋ผ๊ณ ๋ ํ๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์
1. ํ๋ค์ด(Top-Down) ๋ฐฉ์
- ํฐ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ผ๋ฉด ๊ทธ ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์
# ํผ๋ณด๋์น ์์ด
# ๋ฉ๋ชจ์ด์ ์ด์
m = [0 for _ in range(101)]
# ์ฌ๊ท
def fibo(x):
if x == 1 or x == 2:
return 1
if m[x] != 0:
return m[x]
m[x] = fibo(x-1) + fibo(x-2)
return m[x]
2. ๋ณดํ ์ (Bottom-Up) ๋ฐฉ์
- ๋ณดํต DP ๋ฌธ์ ์ ํ์ด ๋ฐฉ์
- ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ต์ ๋์ถํ๋ ๋ฐฉ๋ฒ
- ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
# ํผ๋ณด๋์น ์์ด
dp = [0 for _ in range(101)]
dp[1] = 1
dp[2] = 1
n = 99
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
โป recursion depth์ ๊ด๋ จ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด sys ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์๋ setrecursionlimit() ํจ์๋ฅผ ํธ์ถํ๋ฉฐ ์ฌ๊ท ์ ํ ์ํ ๊ฐ๋ฅ
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ํ | ์ต๋ ํ, ์ต์ ํ (0) | 2022.02.23 |
---|---|
[Algorithm] DFS & BFS | ๊ทธ๋ํ ํ์ (0) | 2021.08.14 |
[Algorithm] ์๋ผํ ์คํ ๋ค์ค์ ์ฒด | ์์ ์ฐพ๊ธฐ (2) | 2021.08.01 |
[Algorithm] ์ด์ง ํ์ | Binary Search (0) | 2021.07.31 |
[Algorithm] ์ ๋ ฌ | ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ, ๊ณ์ ์ ๋ ฌ (0) | 2021.07.27 |