DOing
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ with Python ๋ณธ๋ฌธ
๐ก ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
ํ์ํ ๊ณ์ฐ ๊ฐ์ ์ ์ฅํด๋์๋ค๊ฐ ์ฌ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค.
ํฐ ๋ฌธ์ ๋ฅผ ํ๋ฒ์ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ธ ๋, ์ฌ๋ฌ๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ '๋ถํ ์ ๋ณต' ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค. ์ด๋ ๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค. ๊ทธ ๋ฌธ์ ๋ฅผ ๋งค๋ฒ ์ฌ๊ณ์ฐ ํ์ง ์๊ณ ๊ฐ์ ์ ์ฅํ๋ค๊ฐ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด ๋ฐ๋ก ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฝ๊ฐ ๋ ์ฌ์ฉํ์ฌ ์๊ฐ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฌ๋ด์ด์ง๋ง ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ Dynamic์ ๋์ ํ ๋น(Dynamic Allocation)์ Dynamic๊ณผ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค.
๋์ ํ ๋น์์ Dynamic์ 'ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ค'์๋ผ๋ ์๋ฏธ์ด์ง๋ง ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ Dynamic์ ๊ณ ์์์ธ ๋ฒจ๋ง(Richard E. Bellman)์ด ์ฐ๊ตฌ์์์ ํ๋ฉ์ ๋ฐ์ผ๋ ค๊ณ ๋ฉ์๋ ๋จ์ด๋ฅผ ์ ํํ๋ค๊ณ ํ๋ค. Programming์ด๋ ๋จ์ด๋ ์ต์ ํ ์ฐ๊ตฌ ๋ถ์ผ์์ ์ต์ ์ ํ๋ก๊ทธ๋จ์ ์ฐพ์๋ธ๋ค๋ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ์ฌ์ฉํ ์ ์๋ค.
1. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ
: ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ฅผ ๋๋ ์ ์๋ค. ์ด๋ฌํ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
2. ์ค๋ณต๋ ํ์ ๋ฌธ์
: ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ค.
๐ก ํผ๋ณด๋์น ์์ด
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ํ์ ์ธ ์์๊ฐ ๋ฐ๋ก ํผ๋ณด๋์น ์์ด์ด๋ค.
ํผ๋ณด๋์น ์์ด์ ํ์ฌ ํญ์ ๊ณ์ฐํ๊ธฐ ์ํด ์ด์ ๋ํญ์ ํฉ์ ๊ตฌํด์ผํ๋ค. ์ด๋ฅผ ํํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ํ์์ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ก ๊ตฌํํ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def fibo(x):
if x==1 or x==2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(5))
ํด๋น ์ฝ๋๋ O(2^N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋์ด N์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ํ์๊ฐ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๋ค. ์๋ฅผ ๋ค์ด N=30์ด๋ฉด ์ฝ 10์ต ๊ฐ๋์ ์ฐ์ฐ์ ์ํํด์ผํ๋ค. f(5)์ผ๋ ํธ์ถ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ทธ๋ฆผ์ ํตํด ๋์ผํ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ฏธ ํ๋ฒ ๊ณ์ฐํ์ง๋ง ๊ณ์ ํธ์ถํ ๋๋ง๋ค ๊ณ์ฐ์ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆผ์์ fib(1)์ ์ด 5๋ฒ, fib(2)๋ ์ด 3๋ฒ ํธ์ถ๋์ด ๊ณ์ฐ๋์๋ค. ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฌํ ๋ฐ๋ณต์ ์ธ ๊ณ์ฐ์ ๋ฐฉ์งํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค.
๐ก Topdown
ํ๋ค์ด ๋ฐฉ์์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐฉ์ ์ค ํ๋์ด๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (memoiztion)์ด๋ ํ๋ฒ ๊ตฌํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํด๋๊ณ , ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ํ๋ค์ด ๋ฐฉ์์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถํ๋ค๊ณ ํ์ฌ ํํฅ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ์ด๋ฌํ ํ๋ค์ด๋ฐฉ์์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
[ ์ฝ๋: ํ๋ค์ด ๋ฐฉ์์ ์ด์ฉํ ํผ๋ณด๋์น ์์ด ]
# ํ๋ฒ ๊ฒ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ ์ํ ๋ฆฌ์คํธ
memo = [0]*100
# ํผ๋ณด๋์น ์์ด์ ์ฌ๊ทํจ์๋ก ๊ตฌํ(topdown)
def fibo(x):
# fibo(1)=fibo(2)=0
if x==1 or x==2:
return 1
# ์ด๋ฏธ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ
if memo[x] != 0:
return memo[x]
# ์์ง ๊ณ์ฐํ์ง ์์ ๋ฌธ์ ๋ผ๋ฉด ์ ํ์์ ๋ฐ๋ผ์ ํผ๋ณด๋์น ๊ฒฐ๊ณผ ๋ฐํ
memo[x] = fibo(x-1)+fibo(x-2)
return memo[x]
print(fibo(99))
๐ก Bottom-Up
๋ณดํ ์ ๋ฐฉ์์ ํ๋ธ๋ ์ด์ (tabulation)์ ์ฌ์ฉํ์ฌ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐฉ์ ์ค ํ๋์ด๋ค.
ํ๋ธ๋ ์ด์ (tabulation)์ด๋ ํ์ ๋ฌธ์ ๋ถํฐ ์ฒ์ฒํ ํด๊ฒฐํ๋ฉด์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ํ๋ธ๋ ์ด์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋ ์์ ๋ฌธ์ ๋ถํฐ ํฐ ๋ฌธ์ ๊น์ง ํ๋ํ๋ ํ ์ด๋ธ์ ์ฑ์๊ฐ๋ค๋ ์๋ฏธ ๋๋ฌธ์ด๋ค. ๋ณดํ ์ ๋ฐฉ์์ ํ์ ๋ฌธ์ ๋ถํฐ ์์ํด์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ๊ธฐ ๋๋ฌธ์ ์ํฅ์์ด๋ผ๊ณ ๋ ํ๋ค. ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ ํ์ ์ธ ํํ๋ ๋ฐ๋ก ์ด ๋ณดํ ์ ๋ฐฉ์์ด๋ค. ๋ณดํ ์ ๋ฐฉ์์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
[ ์ฝ๋: ํ๋ค์ด ๋ฐฉ์์ ์ด์ฉํ ํผ๋ณด๋์น ์์ด ]
# ์์ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํด์ ์ ์ฅํ dpํ
์ด๋ธ
dp = [0]*100
# fibo(1)=fibo(2)=0
dp[1]=1
dp[2]=1
n=99
# ํผ๋ณด๋์น ์์ด์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ(bottom up)
for i in range(3, n+1):
dp[i] = dp[i-1]+dp[i-2]
print(dp[n])
๐ก ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์์
Q1. 1๋ก ๋ง๋ค๊ธฐ
์ ์ X๊ฐ ์ฃผ์ด์ง ๋ ์ ์ X์ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง์ด๋ค.
a) X๊ฐ 5๋ก ๋๋์ด๋จ์ด์ง๋ฉด, 5๋ก ๋๋๋ค.
b) X๊ฐ 3์ผ๋ก ๋๋์ด๋จ์ด์ง๋ฉด, 3์ผ๋ก ๋๋๋ค.
c) X๊ฐ 2๋ก ๋๋์ด๋จ์ด์ง๋ฉด, 2๋ก ๋๋๋ค.
d) X์์ 1์ ๋บ๋ค.
์ ์ X๊ฐ ์ฃผ์ด์ก์ ๋, ์ฐ์ฐ 4๊ฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ 1์ ๋ง๋ค๋ ค๊ณ ํ๋ค. ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ์์ค
์๋ฅผ ๋ค์ด ์ ์๊ฐ 26์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํด์ 3๋ฒ ์ฐ์ฐ์ด ์ต์๊ฐ์ด๋ค.
1. 26-1=25
2. 25/5=5
3. 5/5=1
*์ ๋ ฅ ์กฐ๊ฑด
์ฒซ์งธ์ค์ ์ ์ X๊ฐ ์ฃผ์ด์ง๋ค(1<=x<=30,000)
*์ถ๋ ฅ ์กฐ๊ฑด
์ฒซ์งธ์ค์ ์ฐ์ฐํ๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค,
*์ ๋ ฅ ์์ : 26
*์ถ๋ ฅ ์์ : 3
[๋ฌธ์ ์์ด๋์ด]
๊ทธ๋ฆฌ๋ ๋ฌธ์ ์ ๋น์ทํด๋ณด์ด๊ฒ ์ง๋ง, ๊ทธ๋ฆฌ๋ ๋ฌธ์ ๋ก ํ๊ฒ๋๋ฉด 26์ด ์ฃผ์ด์ก์ ๋ ์ง๊ธ ๋น์ฅ ์ ํํ ์ ์๋ ์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ธ c์ฐ์ฐ์ ์ํํ์์ ๊ฒ์ด๋ค. ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋๋ก ์ ๊ทผํด์๋ ์๋๋ค.
26์ด๋ผ๋ ์ซ์๊ฐ ์ฃผ์ด์ก์ ๋, f(26)์ d์ฐ์ฐ์ ์ํํ๋ f(25), c์ฐ์ฐ์ ์ํํ๋ f(13), b์ฐ์ฐ์ ์ํํ๋ f(12)์ ์ฐ์ฐ์ ๋ค์ ์ํํ๊ฒ ๋๋ค. ์ด๋ฅผ ์์ผ๋ก ํํํ๊ฒ๋๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
f(i)=min(f(i//5)+1, f(i//3)+1, f(i//2)+1, f(i)+1)
์ด๋ฐ์์ผ๋ก ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ํ์ฉํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
[์ฝ๋]
x = int(input())
# ์์ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํด์ ์ ์ฅํ dpํ
์ด๋ธ
dp = [0]*30001
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(bottom up)
for i in range(2, x+1):
## ์ฐ์ฐ์ด ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ํํด๋ณด๊ณ ๊ฐ์ฅ ์์๊ฐ์ ๊ฐ์ ธ๊ฐ๋ค.
# d์ฐ์ฐ
dp[i] = dp[i-1]+1
# a์ฐ์ฐ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if i%5 ==0:
dp[i] = min(dp[i], dp[i//5]+1)
# b์ฐ์ฐ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if i%3==0:
dp[i] = min(dp[i], dp[i//3]+1)
# c์ฐ์ฐ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if i%2==0:
dp[i] = min(dp[i], dp[i//2]+1)
print(dp[x])
Q2. ๊ฐ๋ฏธ ์ ์ฌ
๋ฉ๋๊ธฐ ๋ง์์๋ ์ฌ๋ฌ ๊ฐ์ ์๋์ฐฝ๊ณ ๊ฐ ์๋๋ฐ ์๋์ฐฝ๊ณ ๋ ์ผ์ง์ ์ผ๋ก ์ด์ด์ ธ์๋ค. ๊ฐ ์๋ ์ฐฝ๊ณ ์๋ ์ ํด์ง ์์ ์๋์ ์ ์ฅํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋ฏธ์ ์ฌ๋ ์๋์ฐฝ๊ณ ๋ฅผ ์๋ต์ ์ผ๋ก ์ฝํํ์ฌ ์๋์ ๋นผ์์ ์์ ์ด๋ค. ์ด๋ ๋ฉ๋๊ธฐ ์ ์ฐฐ๋ณ๋ค์ ์ผ์ง์ ์์ ์กด์ฌํ๋ ์๋์ฐฝ๊ณ ์ค์์ ์๋ก ์ธ์ ํ ์๋์ฐฝ๊ณ ๋ฅผ ๊ณต๊ฒฉ๋ฐ์ผ๋ฉด ๋ฐ๋ก ์์์ฑ ์ ์๋ค. ๋ค๋ผ์ ๊ฐ๋ฏธ์ ์ฌ๊ฐ ์ ์ฐฐ๋ณ์๊ฒ ๋คํค์ง ์๊ณ ์๋์ฐฝ๊ณ ๋ฅผ ์ฝํํ๊ธฐ ์ํด์๋ ์ต์ํ ํ์นธ ์ด์ ๋จ์ด์ง ์๋์ฐฝ๊ณ ๋ฅผ ์ฝํํด์ผํ๋ค. ์๋ฅผ ๋ค์ด ์๋์ฐฝ๊ณ 4๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ์.
1 | 2 | 3 | 5 |
์ด๋ ๊ฐ๋ฏธ์ ์ฌ๋ ๋๋ฒ์งธ ์๋์ฐฝ๊ณ ์ ๋ค๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ์ ํํ์๋ ์ต๋๊ฐ์ธ ์ด 8๊ฐ์ ์๋์ ๋ฐฐ์์ ์ ์๋ค. ๊ฐ๋ฏธ์ ์ฌ๋ ์ต๋ํ ๋ง์ ์๋์ ์ป๊ธฐ ์ํ๋ค. ๊ฐ๋ฏธ์ ์ฌ๋ฅผ ์ํด ์๋์ฐฝ๊ณ N๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์๋ ์ป์ ์ ์๋ ์๋์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
*์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ์๋์ฐฝ๊ณ ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค.(3<=x<=100)
- ๋์งธ์ค์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ๊ฐ ์๋์ฐฝ๊ณ ์ ์ ์ฅ๋ ์๋์ ๊ฐ์ K๊ฐ ์ฃผ์ด์ง๋ค.(0<=K<=1,000)
*์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ๊ฐ๋ฏธ ์ ์ฌ๊ฐ ์ป์ ์ ์๋ ์๋์ ์ต๋๊ฐ์ ์ถ๋ ฅํ์์ค
*์ ๋ ฅ์์
4
1 3 1 5
*์ถ๋ ฅ์์
8
[๋ฌธ์ ์์ด๋์ด]
ํ์ฌ ๋ฐ๊ฒฌํ ์ต๋ ์๋์ด๋ผ๊ณ ๋ง ํธ์๋ค๊ฐ๋ ์ต์ ํด๋ฅผ ๋ชป์ฐพ์ ์ ์๋ค. ๋๋ฌธ์ ์ด๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋๋ก๋ ํ ์ ์๋ค. ํ์ฌ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์ด์ผ ํ ์ง ์ ํธ์ด์ผํ ์ง๋ ์ด์ ์๋์ฐฝ๊ณ ์ ๋ฌ๋ ค์๋ค.
์๋ฅผ ๋ค์ด i๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์ด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์ง ์๊ณ i-2๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์์ ๊ฒฝ์ฐ์ด๋ค.
๋ฐ๋๋ก i๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ๋ฉด์๋๋ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์์ ๊ฒฝ์ฐ์ด๋ค. ๊ทธ๋์ i๋ฒ์งธ ์๋์ฐฝ๊ณ ๋ฅผ ํธ์ง์ํธ์ง ๊ฒฐ์ ํ๋ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
f(i)=max(f(i-1), f(i-2)+k(i))
์ด๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋๋ค. ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ํ์ฉํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
[์ฝ๋]
n = int(input())
food = list(map(int, input().split()))
# ์์ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํด์ ์ ์ฅํ dpํ
์ด๋ธ
dp = [0]*100
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(bottom up)
dp[0] = food[0]
dp[1] = max(food[0], food[1])
for i in range(n):
dp[i]=max(dp[i-1], dp[i-2]+food[i])
print(dp[n-1])
Q3. ํจ์จ์ ์ธ ํํ๊ตฌ์ฑ
N๊ฐ์ง ์ข ๋ฅ์ ํํ๊ฐ ์๋ค. ์ด ํํ๋ค์ ๊ฐ์๋ฅผ ์ต์ํ์ผ๋ก ์ด์ฉํด์ ๊ทธ ๊ฐ์น์ ํฉ์ด M์์ด ๋๋๋ก ํ๋ ค๊ณ ํ๋ค. ์ด๋ ๊ฐ ํํ๋ ๋ช๊ฐ๋ผ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉํ ํํ์ ๊ตฌ์ฑ์ ๊ฐ์ง๋ง ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ๋ก ๊ตฌ๋ถํ๋ค. ์๋ฅผ ๋ค์ด 2์, 3์ ๋จ์์ ํํ๊ฐ ์์ ๋๋ 15์์ ๋ง๋ค๊ธฐ ์ํด 3์์ 5๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ต์ํ์ ํํ ๊ฐ์์ด๋ค.
*์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์์ N, M์ด ์ฃผ์ด์ง๋ค.(1<=N<=100, 1<=M<=10,000)
- ์ดํ์ N๊ฐ์ ์ค์๋ ๊ฐ ํํ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ค. ํํ์ ๊ฐ์น๋ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
*์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์๋ ๊ฒฝ์ฐ์ ์ X๋ฅผ ์ถ๋ ฅํ๋ค.
- ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์ | ์ถ๋ ฅ ์์ |
2 15 2 3 |
5 |
3 4 3 5 7 |
-1 |
[๋ฌธ์ ์์ด๋์ด]
์ฃผ์ด์ง ํํ๋ด์์ ๋ง๋ค ์ ์๋ ์์ ๊ธ์ก๋ถํฐ ํฐ ๊ธ์ก๊น์ง ํ์ธํ๋ฉฐ ์ฐจ๋ก๋๋ก ๋ง๋ค ์ ์๋ ์ต์ํ์ ํํ ๊ฐ์๋ฅผ ์ฐพ์์ผํ๋ค. ๊ธ์ก i๋ฅผ ๋ง๋ค ์ ์๋ ์ต์ํ์ ํํ ๊ฐ์๋ฅผ f(i), ํํ ๋จ์๋ฅผ k๋ผ๊ณ ํ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ๋ง๋ค ์ ์๋ค.
1) f(i-k)๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ f(i) = min(f(i), f(i-k)+1)
2) f(i-k)๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ f(i) = 10,001
ํด๋น ์์ ๋ชจ๋ ํํ๋จ์์ ๋ํ์ฌ ์ฐจ๋ก๋๋ก ์ ์ฉํ๋ฉด ๋๋ค.
์ ๋ ฅ ์์1๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
(์ด๊ธฐ)
์ธ๋ฑ์ค | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
๊ฐ | 0 | 10,001 | 10,001 | 10,001 | 10,001 | 10,001 | 10,001 |
1. ํํ ๋จ์ 2์ ํ
(k=2)
์ธ๋ฑ์ค | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
๊ฐ | 0 | 10,001 | f(2) =min(10,001, f(0)+1) =1 |
10,001 | f(4) =min(10,001, f(2)+1) =2 |
10,001 | f(6) =min(10,001, f(4)+1) =3 |
2. ํํ ๋จ์ 3 ์ ํ
(k=3)
์ธ๋ฑ์ค | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
๊ฐ | 0 | 10,001 | 1 | f(3) =min(10,001,f(0))+1 =1 |
2 | 10,001 | f(6) =min(3, f(3)+1) =2 |
ํนํ f(6)์ ์ฃผ์๊น๊ฒ ํ์ธํด์ผ ํ๋ค.
[์ฝ๋]
n, m = map(int, input().split())
money_type=[]
for _ in range(n):
money_type.append(int(input()))
# ์์ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํด์ ์ ์ฅํ dpํ
์ด๋ธ
dp = [10001]*(m+1)
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(bottom up)
dp[0]=0
# ๋ชจ๋ ๊ธ์ก์ ํ๋์ฉ ๋ง๋ค์ด๋ณธ๋ค
for i in range(n):
# ํํ ์ข
๋ฅ๋ฅผ ํ๋์ฉ ์ฌ์ฉํด์
for j in range(money_type[i], m+1):
# (i-k)์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ ๊ฒฝ์ฐ์๋ง ํด๋น ํํ๋ก i์์ ๋ง๋ ๋ค
if dp[j-money_type[i]] != 10001:
# ๋ ์์ ๊ฐฏ์๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๊ฐฑ์
dp[j] = min(dp[j], dp[j-money_type[i]]+1)
# ๊ณ์ฐ๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ
if dp[m] == 10001:
print(-1)
else:
print(dp[m])
์ถ์ฒ :
ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ(๋ฐ์๊ธธ)
์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค(๋๋๋น)
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์์ with Python (0) | 2021.05.23 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ ์ต๋จ๊ฒฝ๋ก with Python (0) | 2021.05.23 |
[์๊ณ ๋ฆฌ์ฆ] ์ด์งํ์ with Python (0) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ with Python (1) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] BFS with Python (1) | 2021.05.22 |