์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ๋ชจ๊ฐ์ฝ
- ๊ฐ๋ฐ
- ์ฝ๋ฉ
- CSS
- Python
- JS
- ์ฝ๋ฉ์ ํ
- ๊ทธ๋ฆฌ๋
- ๊ตญ๋น์ง์
- ์ฝ๋ฉํ ์คํธ
- ๋ ธ๋ง๋์ฝ๋
- KDT
- fe
- HTML
- heapq
- error
- ํ๋ก์ ํธ
- ๋ฐฑ์ค
- ์๊ณ ๋ฆฌ์ฆ
- node.js
- react
- Til
- ๋๋ฆผ์ฝ๋ฉ
- ํ ์ดํ๋ก์ ํธ
- ํ๋ก๊ทธ๋๋จธ์ค
- mongodb
- ํฌ๋กค๋ง
- ํ์ด์ฌ
- javascript
- ํ๋ก ํธ์๋
- Today
- Total
๐ฑ → ๐ณ
Algorithm) Dynamic Programming ๋ณธ๋ฌธ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ( ๋์ ๊ณํ๋ฒ)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ ์ฌ์ฉํ์ฌ ์ํ ์๊ฐ ํจ์จ์ฑ์ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํค๋ ๋ฐฉ๋ฒ
์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ(์์ ๋ฌธ์ )๋ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅํ์ฌ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํจ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ์ง ๋ฐฉ์
- ํ ๋ค์ด(ํํฅ์)
- ๋ณดํ ์ (์ํฅ์)
์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ๋ถ์ผ์์ ๋์ (dynamic)์ด๋?
- ์๋ฃ๊ตฌ์กฐ์์ ๋์ ํ ๋น(dynamic allocation)์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ค์ ์คํ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ธฐ๋ฒ์ ์๋ฏธ
- ๋ฐ๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ‘๋ค์ด๋๋ฏน’์ ๋ณ ์๋ฏธ ์์ด ์ฌ์ฉ๋ ๋จ์ด
๋ค์ด๋๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์กฐ๊ฑด
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal Substructure)
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์
- ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblem)
- ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐ
ํผ๋ณด๋์น ์์ด
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ๊ณ์ฐํ ์ ์์
1, 1, 2, 3 , 5 , 8, 13, 21, 34 ,55, …
์ ํ์ : ์ธ์ ํ ํญ๋ค ์ฌ์ด์ ๊ด๊ณ์
ํผ๋ณด๋์น ์์ด์ ์ ํ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์
๋จ์ ์ฌ๊ท๋ก ํผ๋ณด๋์น ์์ด ํด๊ฒฐ
def fibo(x):
if x == 1 or x ==2:
return 1
return fibo(x-1) + fibo(x-2)
print(fibo(4)) # 3
๋จ์ ์ฌ๊ท์ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๋จ์ ์ฌ๊ท ํจ์๋ก ํผ๋ณด๋์น ์์ด์ ํด๊ฒฐํ๋ฉด ์ง์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง
- f(n)์ด ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ ๊ฒ ํ์ธ(์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ )
ํผ๋ณด๋์น ์์ด์ ํจ์จ์ ์ธ ํด๋ฒ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ ์กฐ๊ฑด ๋ง์กฑํ๋์ง ํ์ธ
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ: ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค
- f(4)๋ฅผ ๊ตฌํ๊ธฐ ์ํด f(3), f(2)๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋๋ ์ ์์
- ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ : ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐ
- f(n)์ด ์ฌ๋ฌ ๋ฒ ํธ์ถ ๋๋ ๊ฒ ํ์ธํ ์ ์์
→ ํผ๋ณด๋์น ์์ด์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ ์กฐ๊ฑด ๋ง์กฑ
๋ฉ๋ชจ์ด์ ์ด์ (memoization)
๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ตฌํ ๋ฐฉ๋ฒ์ค ํ๋
ํ ๋ฒ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํ๋ ๊ธฐ๋ฒ
๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ๋ ๊ฒฐ๊ณผ ๊ทธ๋๋ก ๊ฐ์ ธ์ด
๊ฐ์ ๊ธฐ๋กํด ๋๋๋ค๋ ์ ์์ ์บ์ฑ(cashing)์ด๋ผ๊ณ ๋ ํจ
ํ๋ค์ด vs ๋ณดํ ์
ํ๋ค์ด(๋ฉ๋ชจ์ด์ ์ด์ ) ๋ฐฉ์์ ํํฅ์์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๋ณดํ ์ ๋ฐฉ์์ ์ํฅ์์ด๋ผ๊ณ ๋ ํจ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ ํ์ ์ธ ํํ๋ ๋ณดํ ์ ๋ฐฉ์
๊ฒฐ๊ณผ ์ ์ฅ์ฉ ๋ฆฌ์คํธ๋ DP ํ ์ด๋ธ์ด๋ผ๊ณ ๋ถ๋ฆ
์๋ฐํ ๋งํ๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ์์ ์ผ๋ก ๊ธฐ๋กํด ๋๋ ๋์ ๊ฐ๋
- ๋ฐ๋ผ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ตญํ๋ ๊ฐ๋ ์ ์๋
- ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋๊ธฐ๋ง ํ๊ณ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ํด ํ์ฉํ์ง ์์ ์ ์์
ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ๋ ๊ฒฝ์ฐ ํผ๋ณด๋์น ์์ด ํจ์์ ์๊ฐ ๋ณต์ก๋๋ $O(N)$
# ํ ๋ฒ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ memoizationํ๊ธฐ ์ํ ๋ฆฌ์คํธ ์ด๊ธฐํ
d = [0]* 100
# ํผ๋ณด๋์น ํจ์๋ฅผ ์ฌ๊ทํจ์๋ก ๊ตฌํ(ํ๋ค์ด)
def fibo(x):
print('f(' + str(x) + ')', end=' ')
# ์ข
๋ฃ ์กฐ๊ฑด
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(6))
f(6) f(5) f(4) f(3) f(2) f(1) f(2) f(3) f(4) 8
๋ณดํ ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์์ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํ๊ณ ์์ ๋ฌธ์ ๋ฅผ ํ ๋๋ก ์์ผ๋ก์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ
d = [0]*100
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]) # 218922995834555169026
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ vs ๋ถํ ์ ๋ณต
๊ณตํต์ :
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉํ ์ ์์
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
์ฐจ์ด์ : ๋ถ๋ถ ๋ฌธ์ ์ ์ค๋ณต
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ : ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น๋ฉฐ ๋ถ๋ถ ๋ฌธ์ ์ค๋ณต
๋ถํ ์ ๋ณต : ๋์ผํ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋์ง ์์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
์ฃผ์ด์ง ๋ฌธ์ ๊ฐ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ ํ์์ ํ์ ํ๋ ๊ฒ์ด ์ค์
๊ฐ์ฅ ๋จผ์ ๊ทธ๋ฆฌ๋, ๊ตฌํ, ์์ ํ์ ๋ฑ์ ์์ด๋์ด๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ๊ฒํ
-> ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ณ ๋ ค
์ผ๋จ ์ฌ๊ท ํจ์๋ก ๋นํจ์จ์ ์ธ ์์ ํ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ค์ด(ํ๋ค์ด)์์ ๋ฌธ์ ์์ ๊ตฌํ ๋ต์ด ํฐ ๋ฌธ์ ์์ ๊ทธ๋๋ก ์ฌ์ฉ๋ ์ ์์ผ๋ฉด, ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์
์ผ๋ฐ์ ์ธ ์ฝ๋ฉํ ์คํธ ์์ค์์๋ ๊ธฐ๋ณธ ์ ํ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๊ฐ ์ถ์ ๋๋ ๊ฒฝ์ฐ ๋ง์
์์ 1) ๊ฐ๋ฏธ ์ ์ฌ
๊ฐ๋ฏธ ์ ์ฌ: ๋ฌธ์ ํด๊ฒฐ ์์ด๋์ด
ํ์ด์ฌ ์ฝ๋
n = int(input())
arr = list(map(int, input().split()))
d = [0]*100
# ๋ณดํ
์ ๋ฐฉ์
d[0] = arr[0]
d[1] = max(arr[0], arr[1])
for i in range(2, n):
d[i] = max(d[i-1], d[i-2]+arr[i])
print(d[n-1]) # 8
'Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11729๋ฒ: ํ๋ ธ์ด์ ํ ์ด๋ ์์ - python (0) | 2022.12.30 |
---|---|
[๋ฐฑ์ค] 25501๋ฒ: ์ฌ๊ท์ ๊ท์ฌ python (0) | 2022.11.16 |
Algorithm) Binary Search(์ด์งํ์) (0) | 2022.10.25 |
Algorithm) DFS/BFS (0) | 2022.10.25 |
Algorithm) Greedy (0) | 2022.10.25 |