์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |
- ํ๋ก๊ทธ๋๋จธ์ค
- ๊ตฌํ
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- ๊ทธ๋ํํ์
- ํ์ด์ฌ
- ์๋ฃ๊ตฌ์กฐ
- LIS
- ์ฐ์ ์์ํ
- DP
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- db
- ์ค๋ธ์
- ๋์ ๊ณํ๋ฒ
- ์ํ
- ์์ํ์
- ๊น์ด์ฐ์ ํ์
- SQL
- ๋๋น์ฐ์ ํ์
- ๋ฐฑ์ค
- BFS
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์๊ณ ๋ฆฌ์ฆ
- ๋์ ํฉ
- ์ ๋ ฌ
- ์์๊ตฌํ๊ธฐ
- ๊ทธ๋ฆฌ๋
- DFS
- ๋ณํฉ์ ๋ ฌ
- ๊ทธ๋ํ
- ๋จธ์ง์ํธ
๐๐ญ๐ฐ๐ธ ๐ฃ๐ถ๐ต ๐ด๐ต๐ฆ๐ข๐ฅ๐บ
[์๊ณ ๋ฆฌ์ฆ] ๋์ ๊ณํ๋ฒ(Dynamic Programming) ๋ณธ๋ฌธ
'์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ํ ์๋ฃ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ with C++' ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์์ต๋๋ค.
1. ๋์ ๊ณํ๋ฒ ; dynamic programming
1.1 ๊ฐ๋
๋ถํ ์ ๋ณต ํจ๋ฌ๋ค์ ๊ฐ๋ ์ ํ์ฅํ ๊ฒ์ผ๋ก, ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฌธ์ ๋ฅผ ์ผ์ปซ๋ ๋ง์ด๋ค. ์ธ๋ป ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๋น์ทํ๋ค ์๊ฐ๋ ์ ์์ง๋ง, ๋ถํ ์ ๋ณต๊ณผ ๊ตฌ๋ถ๋๋ ๋์ ๊ณํ๋ฒ๋ง์ ํน์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (overlapping subproblem)
2. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(optimal substructure)
๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๋ง์กฑํด์ผ ๋์ ๊ณํ๋ฒ์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ ์ฒด ๋ฌธ์ ๊ฐ ๋ ๋ฆฝ์ ์ธ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๋ ๋ถํ ์ ๋ณต ๋ฌธ์ ์ ๋ฌ๋ฆฌ ๋์ ๊ณํ๋ฒ์์๋ ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํ๋ค. ๋ํ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ์ ๋ต์ ์ด์ฉํ์ฌ ์ ์ฒด ๋ฌธ์ ์ ๋ํ ์ต์ ์ ๋ต์ ํํํ ์ ์๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณด์. ์ฌ๊ท ํจ์๋ฅผ ๋ฐฐ์ธ ๋ ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ฐ๋ ํผ๋ณด๋์น ์์ด์ ๋ ์ฌ๋ฆด ์ ์๋ค.
{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... } ์ ๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ์์ด์ ํผ๋ณด๋์น ์์ด์ด๋ผ๊ณ ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์๊ณ ์๋ ๊ท์น์ ์ฐพ์๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
F(0) = 0
F(1) = 1
..
F(n) = F(n - 1) + F(n - 2)
F(n)์ ์ด์ ์์ ๋ ๊ฐ(F(n-1), F(n-2))์ ์ํด ๊ฒฐ์ ๋๊ณ , F(n) = F(n - 1) + F(n - 2) ์ ๊ฐ์ด ํํ๋๋ ์์์ ์ด ์์ด์ ์ฌ๊ท ๊ด๊ณ(recurrence relation) ๊ฐ ๋๋ค.
F(5)๋ฅผ ๊ตฌํ๋ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์ ์ฌ๊ท ํธ๋ฆฌ์์ F(4) = F(3) + F(2)์ด๊ณ , F(3) = F(2) + F(1) ์ด๊ธฐ ๋๋ฌธ์ F(2)๋ F(4)์ F(3)์ ๊ตฌํ๋ ๊ณผ์ ์์ ์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ๋ค. ์ด๋ฅผ ํตํด ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ํ F(2)๋ F(4)๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์๋, F(3)์ ๊ตฌํ๋ ๊ณผ์ ์์๋ ์ฌ์ฉ์ด ๋๋ค. F(4)๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ด์ ์ ๊ตฌํด๋์์ F(2)๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๋ง์กฑํ๋ค.
1.2 ์ ๊ทผ๋ฐฉ๋ฒ
์ ๊ทผ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์บ์(cache)์ ๊ธฐ๋กํ๋ ํํฅ์ ์ ๊ทผ๋ฐฉ๋ฒ(top-down approach)๊ณผ ํ๋ฅผ ๋ง๋ค์ด ์ ์ฅํ๋ ์ํฅ์ ์ ๊ทผ๋ฐฉ๋ฒ(bottom-up approach)์ผ๋ก ๋๋ ์ ์๋ค.
1.2.1 ๋ฉ๋ชจ์ด์ ์ด์ ; ํํฅ์ ์ ๊ทผ ๋ฐฉ๋ฒ
๋ฉ๋ชจ๋ฅผ ํ๋ค๋ ๋ป์ ๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ ๊ฐ ๋จ๊ณ๋ง๋ค ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ต์ ์ฐพ์ผ๋ฉด ๋ฐฐ์ด ๊ตฌ์กฐ์ ์บ์์ ์ ์ฅํ๋ค. ์บ์์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ ์ฅ๋์ด ์๋ค๋ฉด ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ๋ค. ์ฝ๊ฒ ์๊ฐํ๋ฉด ์ฌ๊ท ํจ์๋ฅผ ํตํด ์์์๋ถํฐ ๊ณ์ฐํด ๋๊ฐ๋ ๋ฐฉ์์ด ์ด์ ํด๋นํ๋ค.
1.2.2 ํ๋ทธ๋ ์ด์ ; ์ํฅ์ ์ ๊ทผ ๋ฐฉ๋ฒ
ํ ์ด๋ธ์ ์ ๋ฆฌํ๋ค๋ ์๋ฏธ์ ํ๋ทธ๋ ์ด์ (tabulation)์ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ํด๋ต์ ํ์ ์ ์ฅํ ํ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ํด๋ต์ ์ ์ฅํด๋๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํจ์จ์ ์ด๊ณ , ๊ฐ๋ฅํ ๋ชจ๋ ์ํ๋ฅผ ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ ์์์ ์ฌ๋ฌ ์ํ๋ฅผ ์ฐธ์กฐํ๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
ํ๋ทธ๋ ์ด์ ์ ๋ ๋ง์ด ์ฌ์ฉํ๊ธด ํ์ง๋ง, ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ํ๋ทธ๋ ์ด์ ์ผ๋ก ํด๊ฒฐํ ์ ์๊ณ , ๊ทธ ๋ฐ๋ ์ญ์ ๊ฐ๋ฅํ๋ค. ํผ๋ณด๋์น ์์ด์ ์๋ฅผ ๋ค์ด๋ณด์.
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ ์ฌ๊ท๋ฅผ ์ด์ฉํ ํผ๋ณด๋์น ์์ด ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
int Fibonacci(int n) {
if(n < 2) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
์์ ํจ์๋ฅผ ๋ฃ์ด ์ฝ๋๋ฅผ ์คํํ๋ค๋ฉด, n์ ์กฐ๊ธ๋ง ํฐ ์๊ฐ ๋ค์ด๊ฐ๋ ๋ต์ด ๋์ค๋ ๋ฐ ๊ต์ฅํ ์ค๋๊ฑธ๋ฆฌ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ ์ ํจ์์ ์๊ฐ๋ณต์ก๋๊ฐ O(2^n)์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์์ ์ค๋ช ํ ๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ด์ฉํ์ฌ ํ์ด๋ณด๋๋ก ํ๋ค.
#1. ๋ฉ๋ชจ์ด์ ์ด์
#define MAX 101
vector<int> memo(MAX, -1);
int DP(int num) {
if(num < 2) return num; // ๊ธฐ์ ์ํ ์ค์
if(memo[num] > 0) return memo[num];
int result = DP(n - 1) + DP(n - 2);
memo[num] = result;
return result;
}
#2. ํ๋ทธ๋ ์ด์
int DP(int num) {
vector<int> table(num + 1, 0);
table[1] = 1; // ๊ธฐ์ ์ํ ์ค์
for(int i = 2; i <= num; i++) {
table[i] = table[i - 1] + table[i - 2];
}
return table[num];
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด๋ถ ํ์(Binary Search) (0) | 2021.08.08 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ์ํ ๋ฌธ์ - 2. ๋๋น ์ฐ์ ํ์(BFS) (0) | 2021.07.22 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ์ํ ๋ฌธ์ - 1. ๊น์ด ์ฐ์ ํ์(DFS) (0) | 2021.07.21 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ - 2. ํต ์ ๋ ฌ(Quick Sort) (0) | 2021.07.15 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ - 1. ๋ณํฉ ์ ๋ ฌ(Merge Sort) (0) | 2021.07.14 |