[Algorithm] Dynamic Programming(1) - Warm Up
๐คDynamic Programming
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ์๊ฐ์๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ค ๊ฒ์ธ๊ฐ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ ํผ๋ณด๋์น ์์ด
์ปดํจํฐ๋ฅผ ๋ฐฐ์ด ์ฌ๋์ด๋ผ๋ฉด ํ ๋ฒ์ฏค ํ์ด๋ดค์ ํผ๋ณด๋์น ์์ด ๋ฌธ์ ์ ๋๋ค. (ํผ๋ณด๋์น ์์ด์ ์ ๋ชจ๋ฅด์๋ ๋ถ์ ํด๋น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค.)
ํผ๋ณด๋์น ์์ด์ Recursion์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๐ ํผ๋ณด๋์น ์์ด ์๋์ฝ๋
fib(n):
if(n == 0)
return 0
if(n == 1)
return 1
return fib(n-1) + fib(n-2)
ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ subproblem์ ์ ์๋ฅผ ํตํด ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
Subproblem ์ ์
$T(n)$์ ์์ $fib(n)$์ ๋ต์ ์ป์ ๋ ๊น์ง ํ์ํ ์ด addition์ ํ์๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋์ ๊ฐ์ recurrence relation์ ์ป์ ์ ์์ต๋๋ค.
$$T(n) = T(n-1) + T(n-2) + 1,\; T(0) = T(1) = 0$$
ํด๋น recurrennce relation์ ํด๊ฒฐํ๋ฉด $T(n) ~ 1.618^n$์ ์ป์ ์ ์์ต๋๋ค.
๋งค์ฐ ๋๋ฆฐ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ ์๋์ recursion tree๋ฅผ ํตํด ์ด์ ๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค.
recursion tree์์ $F_3$์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ท์ ํธ์ถ์ ์งํํ๋ฉด์ $F_3$๊ฐ ์ด 5๋ฒ ํธ์ถ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฆ, ๊ฐ์ ํจ์๋ฅผ ์ฌ๊ท๋ฅผ ์งํํ๋ ๋์ ๋ฐ๋ณตํด์ ํธ์ถํด์ผ ๋๊ธฐ ๋๋ฌธ์ ๋๋ฆฐ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ฌ๊ท ํธ์ถ์ ์งํํ๋ฉฐ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์ฌ ๋๋ง๋ค ์ ์ฅํ ๋ค, ์ดํ์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค๋ฉด ์ ์ฅํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๐ ์ ์ฅ์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ํผ๋ณด๋์น ์์ด ์๋์ฝ๋
global F[0..n] = {0, 1, null, ... null};
Fib(n):
if (n == 0)
return 0
if (n == 1)
return 1
if F[n] == null
F[n] = Fib(n-1) + Fib(n-2)
return F[n]
์ด์ ๊ฐ์ด ์ฌ๊ทํจ์์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฒ์ memoization์ด๋ผ๊ณ ํฉ๋๋ค.
๋ํ recursion๊ณผ memoization์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ dynamic programming์ด๋ผ๊ณ ํฉ๋๋ค.
ํด๋น ์๋์ฝ๋์ time complexity๋ฅผ ๊ณ์ฐํด๋ณด๊ฒ ์ต๋๋ค.
F[n]์ ๊ฐ์ด null์ผ ๋๋ง ๋ง์ ์ ํ ๋ฒ ์ํํ๋ฉด ํด๋น ๊ฐ์ด ๊ฒฐ์ ๋๋ฏ๋ก ์ด n๋ฒ์ ๋ง์ ์ ์งํํ๊ฒ ๋ฉ๋๋ค.
์ ์ฅ ๋ํ ์ด n๋ฒ ์งํํ๊ธฐ ๋๋ฌธ์ ์ด time complexity๋ $O(n)$์ด ๋ฉ๋๋ค.
์ด๋ฅผ recrsion tree์ ์ ์ฅ๋ ๋ฐฐ์ด๋ก ํ์ธํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
๐ Dynamic Programming์ ์์
Dynamic Programming์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋์ ์์๋ฅผ ๊ฑฐ์น๋ฉด ๋ฉ๋๋ค.
Dynamic programming ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
1. ๋ฌธ์ ๋ฅผ ์ ํํ๊ฒ ์ ์ํฉ๋๋ค.
2. ์ ์๋ ๋ฌธ์ ์ ๋ํ subproblem ์ ์ ์ํ ๋ค (์ ์์์์๋ $subproblem = F_n’ \,(n’ < n)$ ๊ตฌํ๊ธฐ๊ฐ subproblem), subproblem ์ ์ด์ฉํ recurrence relation ์ ์ธ์๋๋ค.
3. Memoizaion ์ ์ด์ฉํ์ฌ recurrence relation ๊ณ์ฐํฉ๋๋ค.
- ์ค๊ฐ ๊ฒฐ๊ณผ๋ฌผ๋ค์ ์ ์ฅํ data structure๋ฅผ ๊ณ ๋ฆ
๋๋ค. (๋ณดํต n ์ฐจ์ array ์ฌ์ฉ.)
- Subproblem ๋ค ๊ฐ์ dependency๋ฅผ ํ์ธํฉ๋๋ค. (์ : $F_n$ ์ ๊ตฌํ๋ ค๋ฉด ์ด๋ค subproblem์ ๋ต๋ค์ ๊ณ์ฐํด ๋์์ผ ํ๋๊ฐ?)
- Dependency ์ ๊ธฐ๋ฐํ์ฌ subproblem ๋ค์ ๋ต์ ๊ตฌํ๋ ์์๋ฅผ ์ ํฉ๋๋ค..
4. Time complexity๋ฅผ ๋ถ์ํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํฉ๋๋ค.
๋ค์ ํฌ์คํ ์์๋ ์ฌ๋ฌ๊ฐ์ง ์์๋ฅผ ํตํด DP๋ฅผ ๋ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ Reference
https://galid1.tistory.com/507
์๊ณ ๋ฆฌ์ฆ - Dynamic Programming(๋์ ํ๋ก๊ทธ๋๋ฐ)์ด๋?
Dynamic Programming(๋์ ๊ณํ๋ฒ) ์ด๋ 1. Dynamic Programming(๋์ ๊ณํ๋ฒ)์ด๋?ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฌธ์ ๋ฅผ ์ผ์ปซ๋ ๋ง์ ๋๋ค. ๋์ ๊ณํ๋ฒ์ด๋ ๋ง ๋๋ฌธ์ ์ด๋ค ๋ถ๋ถ์์ ๋์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ
galid1.tistory.com