์ค๋ณต๋๋ ์ฐ์ฐ์ ์ค์ด์
- ์ด๋ค ๋ฌธ์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฝ๊ฐ ๋ ์ฌ์ฉํ๋ฉด ์ฐ์ฐ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ์ฆ๊ฐ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ํ์ ์ธ ์์๋ก๋ ํผ๋ณด๋์น ์์ด์ด ์๋ค.
- ์ํ์ ์ ํ์์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํํํ๋ ค๋ฉด ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๋ค.
# ํผ๋ณด๋์น ํจ์๋ฅผ ์ฌ๊ท ํจ์๋ก ๊ตฌํ
def fibo(x):
if x == 1 or x == 2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(4))
- ๊ทธ๋ฐ๋ฐ ํผ๋ณด๋์น ์์ด์ ์์ค์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
- f(n) ํจ์์์ n์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ํ ์๊ฐ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๊ธฐ ๋๋ฌธ! -> O(2^N)
- ํผ๋ณด๋์น ์์ด์ ํธ์ถ ๊ณผ์ ์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค ํ์ธํด๋ณด๋ฉด ๋์ผํ ํจ์๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ ๊ฒ์ ์ ์ ์๋ค.
- ์ด๋ฏธ ํ ๋ฒ ๊ณ์ฐํ์ง๋ง, ๊ณ์ ํธ์ถํ ๋๋ง๋ค ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
- ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์กฐ๊ฑด1) ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค.
์กฐ๊ฑด2) ์์ ๋ฌธ์ ์์ ๊ตฌํ ์ ๋ต์ ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ(๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ ์ข ๋ฅ) = ์บ์ฑ
: ํ ๋ฒ ๊ตฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํด๋๊ณ ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ
# ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ ์ํ ๋ฆฌ์คํธ ์ด๊ธฐํ
d = [0] * 100
# ํผ๋ณด๋์น ํจ์๋ฅผ ์ฌ๊ทํจ์๋ก ๊ตฌํ (ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
def fibo(x):
# ์ข
๋ฃ ์กฐ๊ฑด (1 ํน์ 2์ผ ๋ 1์ ๋ฐํ)
if x == 1 or x == 2:
return 1
# ์ด๋ฏธ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ
if d[x] != 0:
return d[x]
# ์์ง ๊ณ์ฐํ์ง ์์ ๋ฌธ์ ๋ผ๋ฉด ์ ํ์์ ๋ฐ๋ผ์ ํผ๋ณด๋์น ๊ฒฐ๊ณผ ๋ฐํ
d[x] = fibo(x-1) + fibo(x-2)
return d[x]
print(fibo(99))
- ์ ๋ฆฌํ์๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ ํฐ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋๊ณ ,
๊ฐ์ ๋ฌธ์ ๋ผ๋ฉด ํ ๋ฒ์ฉ๋ง ํ์ด ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ์ด๋ค.
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(ํต์ ๋ ฌ)๊ณผ ๋ค๋ฅธ์ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น๊ณ ์๋ค๋ ๊ฒ.
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉํ์ ๋์ ํผ๋ณด๋์น ์์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(N)
ใด f(1) ๊ตฌํ ๊ฐ์ด f(2) ํธ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ,
f(2)์ ๊ฐ์ด f(3) ํธ๋ ๋ฐ ์ฌ์ฉ๋๊ณ ···
ใด ํ ๋ฒ ๊ตฌํ ๊ฒฐ๊ณผ๋ ๋ค์ ๊ตฌํด์ง์ง ์๋๋ค.
# ํผ๋ณด๋์น์์ ํธ์ถ๋๋ ํจ์ ํ์ธ
d = [0] * 100
def pibo(x):
print('f(' + str(x) + ')', end=' ')
if x == 1 or x == 2:
return 1
if d[x] != 0:
return d[x]
d[x] = pibo(x-1) + pibo(x-2)
return d[x]
pibo(6)
- ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์,
ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถํ๋ค๊ณ ํ์ฌ ํ๋ค์ด ๋ฐฉ์์ด๋ผ๊ณ ๋งํ๋ค. -> ํํฅ์
- ๋จ์ํ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ
์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ต์ ๋์ถํ๋ค๊ณ ํ์ฌ ๋ณดํ ์ ๋ฐฉ์์ด๋ผ๊ณ ๋งํ๋ค. -> ์ํฅ์
# ํผ๋ณด๋์น ์์ด (๋ฐ๋ณต์ )
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ ์ด๊ธฐํ
d = [0] * 100
# ์ฒซ ๋ฒ์จฐ ํผ๋ณด๋์น ์์ ๋ ๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1
d[1] = 1
d[2] = 1
n = 99
# ํผ๋ณด๋์น ํจ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํ (๋ณดํ
์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
for i in range(3, n+1):
d[i] = d[i-1] + d[i-2]
print(d[n])
์ค์ ๋ฌธ์ 1. 1๋ก ๋ง๋ค๊ธฐ
x = int(input())
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ ์ด๊ธฐํ
d = [0] * 3001
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์งํ (๋ณดํ
์
)
for i in range(2, x+1):
# ํ์ฌ์ ์์์ 1์ ๋นผ๋ ๊ฒฝ์ฐ
d[i] = d[i-1] + 1
# ํ์ฌ์ ์๊ฐ 2๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ
if i % 2 == 0:
d[i] = min(d[i], d[i//2] + 1)
# ํ์ฌ์ ์๊ฐ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ
if i % 3 == 0:
d[i] = min(d[i], d[i//3] + 1)
# ํ์ฌ์ ์๊ฐ 5๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ
if i % 5 == 0:
d[i] = min(d[i], d[i//5] + 1)
print(d[x])
์ค์ ๋ฌธ์ 2. ๊ฐ๋ฏธ ์ ์ฌ
n = int(input())
array = list(map(int, input().split()))
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ
d = [0] * 100
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์งํ (๋ณดํ
์
)
d[0] = array[0]
d[1] = max(array[0], array[1])
for i in range(2, n):
d[i] = max(d[i-1], d[i-2] + array[i])
print(d[n-1])
์ค์ ๋ฌธ์ 3. ๋ฐ๋ฅ ๊ณต์ฌ
n = int(input())
# ์์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ ์ด๊ธฐํ
d = [0] * 1001
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์งํ(๋ณดํ
์
)
d[1] = 1
d[2] = 3
for i in range(3, n+1):
d[i] = (d[i-1] + 2 * d[i-2]) % 796796
print(d[n])
์ค์ ๋ฌธ์ 4. ํจ์จ์ ์ธ ํํ ๊ตฌ์ฑ
n, m = map(int, input().split())
values = []
for i in range(n):
values.append(int(input()))
# ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ DP ํ
์ด๋ธ ์ด๊ธฐํ
dp = [10001] * (m+1)
# ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์งํ (๋ณดํ
์
)
dp[0] = 0
for i in range(n):
for j in range(values[i], m+1):
if dp[j - values[i]] != 10001: # (i - k)์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ
dp[j] = min(dp[j], dp[j - values[i]] + 1)
if dp[m] == 10001: # ์ต์ข
์ ์ผ๋ก M์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒฝ์ฐ
print(-1)
else:
print(dp[m])
'๐ค > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ํ ์ด๋ก (Graph) (0) | 2022.07.18 |
---|---|
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ (Shortest Path Algorithm) (0) | 2022.04.14 |
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ (Binary Search Algorithm) (0) | 2022.02.10 |
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ (Sorting Algorithm) (0) | 2022.02.04 |
DFS / BFS (๊น์ด์ฐ์ ํ์ / ๋๋น์ฐ์ ํ์) (0) | 2022.01.28 |