์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ๋๋๊ทธ ์ด๋ฒคํธ
- JavaScript
- svgํ์ผ ๋ค๋ฃจ๊ธฐ
- ์ด๋ถํ์
- ์นด์นด์ค
- icecandidate
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ธ๋ฃจํธํฌ์ค
- ๋ฆฌ๋์ค ํดํท
- ๊ณผ์ ํ ์คํธ
- Redux toolkit
- Node.js
- ์ด๋ฏธ์ง ์์
- ์ฝ๋ฉํ ์คํธ
- ๋ถ์คํธ์ปจํผ๋ฐ์ค
- ์ฝํ
- TypeScript
- router v6
- React
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- js
- ์นด์นด์ค์ฑ์ฉ
- ๋ถ์คํธ์บ ํ์น๋ชจ๋ฐ์ผ
- custom hook
- ๋ฐฑ์ค
- ๋์ ๊ณํ๋ฒ
- ์๊ณ ๋ฆฌ์ฆ
- ์ฝ๋ ํฌ๋ฉง
- DP
- Today
- Total
๐ฅ dev-ruby
[์๊ณ ๋ฆฌ์ฆ] ๋์ ๊ณํ๋ฒ(Dynamic Programming, DP) ์ด๋? ๋ณธ๋ฌธ
[์๊ณ ๋ฆฌ์ฆ] ๋์ ๊ณํ๋ฒ(Dynamic Programming, DP) ์ด๋?
ruby_s 2021. 12. 21. 16:34๋์ ๊ณํ๋ฒ(Dynamic Programming)์
ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
dp์ ํต์ฌ์ "๋ฉ๋ชจ์ด์ ์ด์ " ๊ธฐ๋ฒ์ธ, ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ํ์ํ ๊ฒฝ์ฐ ๋ค์ ๊ณ์ฐํ์ง ์๊ณ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์์ ๋ฌธ์ ๋ค์ด ๊ณ์ ๋ฐ๋ณต๋๊ณ , ๊ทธ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ด๊ฐ์ ํญ์ ๊ฐ์ ๋ DP ์๊ณ ๋ฆฌ์ฆ ์ ์ฉํ ์ ์๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ์๋ก ํผ๋ณด๋์น ์์ด์ ๋ค ์ ์๋ค.
ํผ๋ณด๋์น ์์ด
ํผ๋ณด๋์น ์์ด์ ์ดํด๋ณด์. ํผ๋ณด๋์น ์์ด์ ์๋์ ๊ฐ๋ค.
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 ...
ํผ๋ณด๋์น ์์ด์ ๊ตฌํ ๋๋ ์ฌ๊ท๋ฅผ ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ด์ ๊ฒฐ๊ณผ์ ์ ์ ๊ฒฐ๊ณผ์ ํฉ์ผ๋ก ๊ณ์ ๊ตฌํด๋๊ฐ๋ ๋ฐฉ์์ด๋ค.
return f(n) = f(n-1) + f(n-2)
๊ทธ๋ฐ๋ฐ, 100๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ๊ฒฝ์ฐ ํจ์ ํธ์ถ์ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๋ค.
5๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ๋, f(3), f(2), f(1) ์ ๊ฐ์ด ๊ฐ์ ์ฐ์ฐ์ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณตํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์, dp๋ฅผ ์ฌ์ฉํ๋ค๋ฉด O(n^2) → O(f(n)) ๋ก ์๊ฐ๋ณต์ก๋๊ฐ ์ค์ด๋ค๊ฒ ๋๋ค. (๋คํญ์ ์์ค์ผ๋ก, ๋ฌธ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.)
DP ์ ์ฉ์กฐ๊ฑด
dp๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- Overlapping Subproblems (๊ฒน์น๋ ๋ถ๋ถ ๋ฌธ์ )
- Optimal Substructure (์ต์ ๋ถ๋ถ ๊ตฌ์กฐ)
1. Overlapping Subproblems
DP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋๋๊ณ ๊ทธ ๋ฌธ์ ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌํ์ฉํด์ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ค.
๊ทธ๋์ ๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณตํ์ฌ ๋ํ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
2. Optimal Substructure
๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌ์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค.
ํ๋ณด๋์น ์์ด์ ๋์ ๊ณํ๋ฒ์ผ๋ก ๊ตฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. Top-down
๋ฌธ์ ํ์ด๊ฐ ์์์ ์๋๋ก ์งํ๋๋ค.
let fiboData = new Array(100).fill(0);
function fibo(n)
{
if (n <= 2)
return 1;
if (fiboData[n] === 0)
fiboData[n] = fibo(n-1) + fibo(n-2);
return fiboData[n];
}
2. Bottom-up
๋ฌธ์ ํ์ด๊ฐ ์๋์์ ์๋ก ์งํ๋๋ค. ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , for๋ฌธ ๋ด์์ ๋ฐ๋ณต๋๋ค.
let fiboData = new Array(100).fill(0);
function fibo(n)
{
fiboData[0] = 0;
fiboData[1] = 1;
for (let i=2; i<=n; i++)
fiboData[i] = fiboData[i - 1] + fiboData[i - 2];
return fiboData[n];
}
๊ฒฐ๋ก
๋์ ๊ณํ๋ฒ์ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ผ์ผ์ด ๊ฒํ ํ์ฌ ์ต์ ์ ํด๋ฅผ ์ฐพ์๋ด๋ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(ํ์ ์๊ณ ๋ฆฌ์ฆ)๊ณผ ๋๋น๋๋ค. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ํด๋ฅผ ๊ตฌํ์ง ์๊ณ ๊ทธ ์๊ฐ์์์ ์ต์ ์ ํด๋ฅผ ์ฐพ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฅ์น๋ ์๊ฐ๋ง์ ๊ณ ๋ คํด์ ํด๋ฅผ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋์ถ๋ ๊ฐ์ด ํญ์ ์ต์ ์ ํด๋ผ๊ณ ํ ์ ์๋ค.
ํ์ง๋ง ๋์ ๊ณํ๋ฒ์ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๊ฒํ ํด ๋ณด๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ํจ์จ์ ์ธ ๊ฐ์ ํํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํญ์ ์ต์ ์ ํด๋ฅผ ๊ตฌํ ์ ์๋ค๋ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ค.
'algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์ (์ด๋ถ ํ์, Binary Search) (0) | 2022.01.26 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ (0) | 2021.11.25 |