[ํ์ด์ฌ/python] ๋์ ๊ณํ๋ฒ (Dynamic Programming)
๋์ ๊ณํ๋ฒ, Dynamic Programming์ ์๋ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ์ฌ์ฉํ๋ค.
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ : ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์์ ๋ฌธ์ ์ ๋ต์ ๋ชจ์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ์ค๋ณต ๋ถ๋ถ ๊ตฌ์กฐ : ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ด ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก
์ํฅ์ ์ ๊ทผ์ด๋ฉฐ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํต์ฌ ๊ธฐ์ ๋ก ์ฌ์ฉํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)์ด๋, ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋ ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ
๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํ์ง ์๋๋กํ์ฌ ์คํ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค.
ํผ๋ณด๋์น ์์ด์ด๋ ์ฌ๊ทํจ์์์ ์ ์ฉํ๊ฒ ์ฐ์ด๋ฉฐ ์ ํ์์ ์ฐพ๋๊ฒ ์ค์ํ๋ค.
๋ฌธ์ ์ ์ํ์ ์ธ ์ฑ์ง์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์ ํ์์ ์ด์ฉํ์ฌ ์ฌ๊ท์ ์ผ๋ก ์ ์ํด์ผ ํ๋ค.
๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ํด๋ฅผ ๊ตฌํ ๋ค ์ ์ฅํ๊ณ ๊ทธ ํด๋ฅผ ์ด์ฉํ์ฌ ๋ ํฐ ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ด๋ค.
ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๊ธฐ
# ๋ฉ๋ชจ์ด์ ์ด์
: ์์ ๋ฌธ์ ์ ํด๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
d = [0] * 100
def fibo(x):
# ์ข
๋ฃ ์กฐ๊ฑด
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]
ํผ๋ณด๋์น ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ด์ฉํ์ฌ ๊ตฌํํด๋ณด์๋ค.
1. ์ ํ์์ ์ฐพ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ํ๋ค.
fibo(x - 1) + fibo(x - 2)
ํผ๋ณด๋์น ์์ ์ ํ์์ ์์ ๊ฐ์ผ๋ฏ๋ก fiboํจ์๋ฅผ ์ด์ฉํด ์ฌ๊ท์ ์ผ๋ก ์ ์ํ์๋ค.
2. ์์ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ์ฌ ์ ์ฅํ๋ค.
d = [0] * 100
d[x] = fibo(x - 1) + fibo(x - 2)
์ ์ฅํ ๊ณต๊ฐ์ธ d๋ฅผ ๋ง๋ค๊ณ x๊ฐ์ ๋ํ ํผ๋ณด๋์น ์์ ๊ฐ์ d์ ์ ์ฅํ๋ค.
3. ์ํ๋ ๊ฐ์ ํด๊ฐ ์ ์ฅ๋์ด ์๋ค๋ฉด, ๊ฐ์ ๊ณ์ฐํ์ง์๊ณ ์ ์ฅ๋ ๊ฐ์ returnํ๋ค.
if d[x] != 0:
return d[x]
์ข ๋ฃ์กฐ๊ฑด์ ํด๋นํ์ง ์๋ ์ x์ ๋ํ์ฌ d์ x์ ๋ํ ๊ฐ์ด ์ ์ฅ๋์ด ์๋์ง ํ์ธํ ํ,
์ ์ฅ๋์ด ์๋ค๋ฉด d[x]๋ฅผ return ํ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ (Brute Force) (0) | 2021.04.02 |
---|---|
[ํ์ด์ฌ/python] ์์ด๊ณผ ์กฐํฉ : itertools ์ด์ฉํ๊ธฐ (permutations, combinations) (0) | 2021.04.01 |
[ํ์ด์ฌ/python] ํ (Queue) (0) | 2021.03.19 |
[ํ์ด์ฌ/python] ์ ๋ ฌ - sort(), sorted() (0) | 2021.03.17 |
[ํ์ด์ฌ/python] ์ด์ง ํ์ (Binary Search) (0) | 2021.03.17 |