- ์ด๋ถํ์
- ์นด์นด์ค ์ฝํ
- DP
- ๋ค์ต์คํธ๋ผ
- LCs
- nestjs
- ์น๋ฆฐ์ด
- ํ๋ก๊ทธ๋๋จธ์ค
- C++
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- js
- ๋ฐฑ์ค
- ์์ฝ๋
- go
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ์๊ณ ๋ฆฌ์ฆ
- golang
- Python
- ๋นํธ๋งต
- DFS
- Union-Find
- ํธ๋ฆฌ
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ๋นํธ๋ง์คํน
- ์ํฐ๋
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ์นด์นด์ค2021
- ์ฌ๊ท
- BFS
- Today
- Total
Hello Ocean! ๐ผ
[์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ์ ๋ต] 8์ฅ ๋์ ๊ณํ๋ฒ_1 ๋ณธ๋ฌธ
๋์ ๊ณํ๋ฒ = dynamic programming
[๊ฐ๋ ]
๋ถํ ์ ๋ณต๊ณผ ๊ฐ์ด ์ฒ์ ์ฃผ์ด์ง ๋ฌธ์ ๋ค์ ๋ ์์ ๋ฌธ์ ๋ค๋ก ๋๋ ๋ค, ์์ ์กฐ๊ฐ๋ค์ ๊ณ์ฐํ๊ณ , ํฉ์ณ์ ๋ ํฐ ๋ฌธ์ ์ ๋ํ ๋ต์ ๊ณ์ฐํด๋ด๋ ์ ๊ทผ ๋ฐฉ์์ ๋งํฉ๋๋ค.
๋ถํ ์ ๋ณต๊ณผ ๋ค๋ฅธ ์ ์ '์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ '๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์ ํ ๋ฒ๋ง ๊ณ์ฐํ๊ฒ๋ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (overlapping subproblem) : ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ์ ๋ ๋ฒ ์ด์ ๊ณ์ฐ ๋๋ ๋ถ๋ถ๋ฌธ์
์์ ์ฌ์ง์์๋ ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ํ ๊ฐ ์ด์ง๋ง, ๊น์ด๊ฐ ๊น์ด์ง ๊ฒฝ์ฐ ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ๋์ ๊ณํ๋ฒ์ด๋ค.
[์์ : ์ดํญ๊ณ์(์กฐํฉ)]
์๋ก ๋ค๋ฅธ n๊ฐ์ ์์ ์ค์ r๊ฐ์ ์์๋ฅผ ์์ ์์ด ๊ณจ๋ผ๋ด๋ ๋ฐฉ๋ฒ์ ์
์ด ๋ฌธ์ ์ ์๊ฐ ๋ณต์ก๋๋ ์ด๋ป๊ฒ ๋ ๊น? => ์ฌ๊ท ํธ์ถ์ด ๋ช ๋ฒ์ด๋ ์ด๋ฃจ์ด์ง๋์ง ๊ณ์ฐ
int bino(int n, int r) {
if (r==0 || n==r) return 1;
return bino(n-1,r-1) + bino(n-1,r);
}
bino(4,2)๋ฅผ ๊ณ์ฐํ๋ค๊ณ ํ ๋, bino(2,1)์ด ๋ ๋ฒ ํธ์ถ๋๋ค.
n๊ณผ r์ ์ซ์๊ฐ ์ปค์ง์ ๋ฐ๋ผ ํจ์์ ์ค๋ณต ํธ์ถ ํ์๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ n๊ณผ r์ด ์ ํด์ ธ ์์ ๋, bino(n,r)์ ๊ฐ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ํญ์ ๊ฐ๋ค.
์ด ์ ์ ์ด์ฉํด์ ๊ฐ n,r์กฐํฉ์ ๋ํ ๊ฐ๋ค์ ์ ์ฅํด๋์ผ๋ฉด, ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ์ ๋, ๋๋ค์ ๊ณ์ฐ๋์ง ์๊ณ ๋ฐฐ์ด์ ์ ์ฅํด๋์ ๊ฐ์ ๊บผ๋ด์ ์ด์ฉํ ์ ์๋ค.
(์ด์ ์ ๊ณ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ ํจ์๋ ์๋ก ๊ณ์ฐํด์ ๋ฐฐ์ด์ ์ ์ฅํด ๋์์ผ ํ๋ค)
[Memorization]
ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ฅผ ๋ง๋ค์ด๋๊ณ , ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํด ๋์๋ค๊ฐ ์ฌํ์ฉํ๋ ์ต์ ํ ๊ธฐ๋ฒ
memorization์ ์ด์ฉํด ์์ binoํจ์๋ฅผ ์์ ํด๋ณด์.
int cache[30][30];
int bino2(int n, int r){
if (r==0 || n==r) return 1;
//์ด์ ์ ์ ์ฅ๋ ๊ฐ์ด ์์ผ๋ฉด
if (cache[n][r] != -1)
return cache[n][r]
//์ด์ ์ ์ ์ฅ๋ ๊ฐ์ด ์์ผ๋ฉด ์๋ก ๊ณ์ฐ ํ ์ ์ฅ
return cache[n][r]=bino2(n-1,r-1) + bino2(n-1,r);
}
memorization์ ์ ์ฉํ๋ฉด ์๋์ ํฅ์์ ๊พํ ์ ์๋ค.
[Memorization์ ์ ์ฉํ ์ ์๋ ๊ฒฝ์ฐ]
ํ๋ก๊ทธ๋๋ฐ์์์ ํจ์๋ ํจ์์ ์ ๋ ฅ ์ธ์๋ ์ ์ญ๋ณ์, ์ ๋ ฅํ์ผ, ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ๋ฑ์ ๋ฐ๋ผ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ์ด ๊ฐ๋ค๊ณ ํญ์ ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ๋์ง ์๋๋ค.
int counter = 0;
int count(){
return counter++;
}
countํจ์๋ ์ ์ญ๋ณ์์ธ counter์ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์, ์ ๋ ฅ์ ์ ํ ๋ฐ์ง ์์ผ๋ฉด์๋ ๋งค๋ฒ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ฉด์ ์์์ ์์ฑํ๋ bino(), bino2()๋ ์ ๋ ฅ์ด ๊ฐ์ผ๋ฉด ํญ์ ์ถ๋ ฅ์ด ๊ฐ์ ํจ์์ด๋ค.
์ฐธ์กฐ์ ํฌ๋ช ์ฑ (referential transparency) : ํจ์์ ๋ฐํ ๊ฐ์ด ๊ทธ ์ ๋ ฅ ๊ฐ๋ง์ผ๋ก ๊ฒฐ์ ๋๋์ง์ ์ฌ๋ถ
memorization์ ์ฐธ์กฐ์ ํฌ๋ช ํจ์์ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์๋ค.
count()์ฒ๋ผ ์ ๋ ฅ์ด ๊ฐ์๋ฐ๋ ์ธ๋ถ ์์์ ๋ฐ๋ผ ์ถ๋ ฅ์ด ๋ฌ๋ผ์ง๋ค๋ฉด, ๋ฏธ๋ฆฌ ์ ์ฅํด๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
[memorization ๊ตฌํ ํจํด]
1. ํญ์ ๊ธฐ์ ์ฌ๋ก๋ฅผ ์ ์ผ ๋จผ์ ์ฒ๋ฆฌํ๋ค.
2. ํจ์์ ๋ฐํ๊ฐ์ ๋ฒ์๋ฅผ ๊ณ ๋ คํ์ฌ cache ๊ฐ์ ์ด๊ธฐํํ๋ค
(memset()์ ์ด์ฉํ๋ฉด ๋ค์ค for๋ฌธ์ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ํธ๋ฆฌํ๋ค. ํ์ง๋ง 0,-1๊ณผ ๊ฐ์ ์ ํ์ ์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
3. ret์ cache[a][b]์ ๋ํ ์ฐธ์กฐํ(reference)์์ ๊ธฐ์ตํ์.
(ret์ ๊ฐ์ ๋ฐ๊พธ๋ฉด cache[a][b]๋ ๊ฐ์ด ๋ฐ๋)
int cache[2500][2500] //a์ b์ ๋ฒ์์ ๋ฐ๋ผ ํฌ๊ธฐ ์กฐ์ ํ๊ธฐ
int someFunction(int a, int b){
if (...) return ... //๊ธฐ์ ์ฌ๋ก ์ฒ๋ฆฌ
int& ret = cache[a][b];
if (ret != -1) return ret; //์ด์ ์ ๊ตฌํ ์ ์ด ์์ ๋
... //์ด์ ์ ๊ตฌํ์ ์ด ์์ ๋, ์๋ก ๋ต ๊ณ์ฐ
return ret;
}
int main() {
memset(cache, -1, sizeof(cache)); //memory ์ด๊ธฐํ
...
}
[memorization ์๊ฐ ๋ณต์ก๋ ๋ถ์]
๊ฐ ์ ๋ ฅ์ ๋ํด ํจ์๋ฅผ ์ฒ์ ํธ์ถํ ๋์ ๊ทธ ๋ค์์ผ๋ก ํธ์ถํ ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
๋ฐ๋ผ์ ๋ณต์กํ์ง๋ง, ์ฃผ๋จน๊ตฌ๊ตฌ์์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ณ์ฐํด๋ณด์
(์กด์ฌํ๋ ๋ถ๋ถ ๋ฌธ์ ์ ์) * (ํ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ ๋ ํ์ํ ๋ฐ๋ณต๋ฌธ์ ์ํ ํ์)
bino2()์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
r์ ์ต๋์น๋ n์ด๊ธฐ ๋๋ฌธ์ bino2()๋ฅผ ๊ณ์ฐํ ๋ ๋ง๋ ์ ์๋ ๋ถ๋ถ ๋ฌธ์ ์ ์๋ ์ต๋ O(n^2)์ด๋ค
๊ฐ ๋ถ๋ถ๋ฌธ์ ๊ณ์ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ฐ๋ณต๋ฌธ์ด ์๊ธฐ ๋๋ฌธ์ O(1)์ด๋ค.
๋ฐ๋ผ์ bino2()์ ์๊ฐ ๋ณต์ก๋๋ O(n^ 2)*O(n) = O(n^2)์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ํญ์ ์ ํํ์ง๋ ์์ง๋ง ๊ฐ๋จํ ๊ณ์ฐํด ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฅผ๋ค์ด ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์ ์ค์ ์ผ๋ถ๋ถ๋ง ๊ณ์ฐํด๋ ๋ต์ ์ฐพ์๋ผ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ์ค์ ์ํ์๊ฐ์ด ์๋ณด๋ค ํจ์ฌ ์ ์ ๊ฒ์ด๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #1417 ๊ตญํ์์ (0) | 2020.04.11 |
---|---|
[C++] ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ (0) | 2020.04.11 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] programmers, N์ผ๋ก ํํ (0) | 2020.04.04 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #2531 ํ์ ์ด๋ฐฅ (0) | 2020.04.04 |
[C++] C++ ์ฝ๋ฉ ์์ํ๊ธฐ (visual studio) (0) | 2020.04.02 |