ํ๋์ ํฐ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋๋์ด์
๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ๋ค์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋์ ๊ณํ๋ฒ, ์ฆ DP๋ ์คํ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋ง์ด ์ฌ์ฉ๋๋ ์ํ์ ์ ๊ทผ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ ์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํ์ง๋ง ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋์ ๊ณํ๋ฒ์์๋ ์ชผ๊ฐ์ง ์์ ๋ฌธ์ ๊ฐ ์ค๋ณต๋๊ณ ,
๋ถํ ์ ๋ณต์ ์ ๋๋ก ์ค๋ณต๋์ง ์์ต๋๋ค.
๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ๋์ ๊ณํ๋ฒ์ผ๋ก ๋ฌธ์ ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- Overlapping Subproblem : ๊ฒน์น๋ ๋ถ๋ถ ๋ฌธ์
- Optimal Substructure : ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ
DP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋๋๊ณ ๊ทธ ๋ฌธ์ ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌํ์ฉํด์ ์ ์ฒด ๋ต์ ๊ตฌํฉ๋๋ค.
๊ทธ๋์ ๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณตํ์ฌ ๋ํ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ ์ด ๊ฐ๋ฅ
ํฉ๋๋ค.
์ฆ, DP๋ ๋ถ๋ถ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ ๊ณ์ฐํ์ง ์์ ์ ์์ด์ผ ํ๋๋ฐ,
ํด๋น ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋์ง ์๋๋ค๋ฉด ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋์ง ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌ์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ ๊ฒฝ์ฐ
๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ทธ๋์ ํน์ ๋ฌธ์ ์ ์ ๋ต์ ๋ฌธ์ ์ ํฌ๊ธฐ์ ์๊ด์์ด ํญ์ ๋์ผํฉ๋๋ค.
DP๋ ํน์ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ผ ํ๋์ ๋ฐฉ๋ฒ๋ก ์ด๋ฏ๋ก ๋ค์ํ ๋ฌธ์ ํด๊ฒฐ์ ์ฐ์ผ ์ ์์ต๋๋ค.
๊ทธ๋์ DP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ฌธ์ ์ธ์ง๋ฅผ ์์๋ด๋ ๊ฒ๋ถํฐ ์ฝ๋๋ฅผ ์ง๋ ๊ณผ์ ์ด ๋์ด๋๊ฐ ์ฌ์ด ๊ฒ๋ถํฐ ์ด๋ ค์ด ๊ฒ๊น์ง ๋ค์ํฉ๋๋ค.
- DP๋ก ํ ์ ์๋ ๋ฌธ์ ์ธ์ง ํ์ธ
- ๋ฌธ์ ์ ๋ณ์ ํ์
- ๋ณ์ ๊ฐ ๊ด๊ณ์ ๋ง๋ค๊ธฐ(์ ํ์)
- ๋ฉ๋ชจ(memoization or tabulation)
- ๊ธฐ์ ์ํ ํ์
- ๊ตฌํ
ํ ๋ฒ ๊ณ์ฐํ ๋ฌธ์ ๋ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ์ ์ฅํด๋๊ณ ํ์ฉํ๋ ๋ฐฉ์
fibonacci(5) = fibonacci(4) + fibonacci(3)
fibonacci(4) = fibonacci(3) + fibonacci(2)
fibonacci(3) = fibonacci(2) + fibonacci(1)
์ด์ฒ๋ผ ๊ฐ์ ์ฐ์ฐ์ด ๊ณ์ ๋ฐ๋ณต์ ์ผ๋ก ์ด์ฉ๋ ๋, ๋ฉ๋ชจ์ด์ ์ด์
์ ํ์ฉํ์ฌ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋๋ฉด ํจ์จ์
ํผ๋ณด๋์น ๊ตฌํ์ ์ฌ๊ท๋ฅผ ํ์ฉํ๋ค๋ฉด ์๊ฐ๋ณต์ก๋๋ O(2^n)์ด์ง๋ง, ๋์ ๊ณํ๋ฒ์ ํ์ฉํ๋ฉด O(N)์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋์ ๊ณํ๋ฒ์ ๊ตฌํ ๋ฐฉ์์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- Top-down : ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ์ด ํธ๋ ๋ฐฉ๋ฒ (์ฌ๊ทํจ์)
- Bottom-up : ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํ๋ ๋ฐฉ๋ฒ (๋ฐ๋ณต๋ฌธ)
Bottom-up ์ ํด๊ฒฐ์ด ์ฉ์ดํ์ง๋ง, ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง
Top-down์ ๊ฐ๋ ์ฑ์ด ์ข์ง๋ง, ์ฝ๋ ์์ฑ์ด ์ด๋ ค์
๋ฌธ์
ํ์ด
Overlapping Subproblem์, Optimal Substructure 2๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ฏ๋ก,
DP
๋ฅผ ์ด์ฉํ์ฌ ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ผ๋จ, 2์ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ๋ฌด์กฐ๊ฑด 1์ ๋นผ์ผ ํ๊ธฐ ๋๋ฌธ์
dp[i] = dp[i - 1] + 1์ ํตํด ํ์๋ฅผ +1 ์ถ๊ฐ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์, dp[i]๊ฐ 2 ์ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ์๋
1์ ๋นผ๋ ๊ฒ ๋ณด๋ค ๋๋์ด ๋จ์ด์ง๋๊ฒ ํจ์ฌ ์ด๋์ด๊ธฐ ๋๋ฌธ์
min(dp[i], dp[i//2]+1)์ ํตํด ์ต์๊ฐ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
import sys
input = sys.stdin.readline
n = int(input())
dp = {
0 : 0,
1 : 0,
}
for i in range(2, n + 1):
dp[i] = dp[i - 1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
print(dp[n])
import sys
input = sys.stdin.readline
num = int(input())
dp = {
0 : 0,
1 : 0,
}
def rec(n):
if n in dp.keys():
return dp[n]
if n % 3 == 0 and n % 2 == 0:
dp[n] = min(rec(n//3) + 1, rec(n//2) + 1)
elif n % 3 == 0:
dp[n] = min(rec(n//3) + 1, rec(n-1) + 1)
elif n % 2 == 0:
dp[n] = min(rec(n//2) + 1, rec(n-1) + 1)
else:
dp[n] = rec(n-1) + 1
return dp[n]
print(rec(num))
https://velog.io/@polynomeer/%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming