๐๋์ ํ๋ก๊ทธ๋๋ฐ
๋์ ํ๋ก๊ทธ๋๋ฐ์ Dynamic Programming ์ฆ, DP๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ์ด๋ค.
๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ ํ์์ผ๋ก ๋ง๋ค์ด ๋ถํ ์ ๋ณตํ ๋, ๋ฐ๋ณต๋ฌธ ๋๋ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด ๊ณผ์ ์์ ๊ณ์ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ฅํด๋์ด ์ค๋ณต๋๋ ๊ณ์ฐ์ ํ์ง ์๋๋ก ๋ง๋ค์ด์ค๋ค. ์ด๋ ์ ํ์ ์ด๋ ๊ฒ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ฅํด๋๋ ๊ฒ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ด๋ผ๊ณ ํ๋๋ฐ, ๋ณดํต ๋ฐฐ์ด์ ํํ๋ก ์ํ๋๋ค.
DP ๊ณผ์
- ์ ์ฒด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋จ์ํํ๋ค.
- 1๋ฒ์ ๊ณผ์ ์์ ์ ํ์์ ๋์ถํ๋ค.
- ์ ํ์์ ์ด์ฉํ์ฌ ๋ฐฐ์ด๋ก ๊ฐ๋จํ ํด๊ฒฐํ ์ ์๋์ง ์๊ฐํ๋ค.
- bottom-up
- top-down
- ์๋ค๋ฉด ์ฌ๊ทํจ์๋ฅผ ๋ง๋ค๊ณ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐฉ์์ ๋ณดํต ๋ฐฐ์ด์ด๋ค.
- ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋ํ ๋ฌธ์
- ํผ๋ณด๋์น ์์ด ๊ตฌํ๊ธฐ
ํผ๋ณด๋์น ์์ด์ ๊ตฌํ๊ธฐ ์ํด์ ์ฌ๊ท ํธ์ถ๋ก ์์ ํ์์ ๋ฐฉ๋ฒ์ ์ด๋ค๋ฉด ๊ทธ ๊ณผ์ ์ค์ ํ ๋ฒ ํธ์ถํ๋ ์ฌ๊ทํจ์๋ฅผ ๋ ํธ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
ํผ๋ณด๋์น 4๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํด๋ณด์.
๋ค์๊ณผ ๊ฐ์ด ์ค๋ณต๋๋ fibo(2)๋ fibo(1), fibo(0)์ด ๊ณ์ ๋ฑ์ฅํ๋ค. DP๋ฅผ ์ฌ์ฉํ๋ฉด fibo(4)์์ ํธ์ถ๋๋ ํจ์๋ 4ํ ๋ฟ์ผ ๊ฒ์ด๋ค.
- ์ ์ฒด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋จ์ํํ๋ค.
- ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ์ ํ์์ ๋ง๋ ๋ค.
fibo(i) = fibo(i-1) + fibo(i-2)
- ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ๋ต์ ์ ์ฅํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.
ํ๋์ ์์๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์์ ์ฐ๋์ ์์ 2๊ฐ๊ฐ ํ์ํจ์ ์ ์ ์๋ค.
- ๋ฐฐ์ด ๊ณฑ์ ๊ณ์ฐ ์์๋ฅผ ์ ํ๋ ๋ฌธ์
๋ฐฐ์ด์ ๊ณฑ์ ๊ณ์ฐ ์์์ ์๊ด์์ด ์ธ์ ๋ ๊ฐ์ด ๊ฐ๋ค. ํ์ง๋ง ์์์ ๋ฐ๋ผ ์ปดํจํฐ์์์ ์๊ฐ๋ณต์ก๋๋ ๋ฌ๋ผ์ง๋ค. ๋ฐ๋ผ์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ๋ฐฐ์ด์ ๊ณฑ์ ๊ตฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ๊ณ์ฐํด์ผํ ์ง๋ฅผ DP๋ก ๊ตฌํด๋ณด์.
์ด๋ ๊ฒ 3๊ฐ์ง์ A, B, C ํ๋ ฌ์ด ์์ ๋ ์ธ ํ๋ ฌ์ ๊ณฑ์ ๊ตฌํ๋ ค ํ๋ค.
์์ ๊ฐ์ 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํ์ ๋ ์ด ์ฐ์ฐ์ ํ์๊ฐ ๋ค๋ฅด๋ค. ๋ ํ๋ ฌ์ ๊ณฑํ ๋๋ ์ ํ๋ ฌ์ ํ๊ณผ ๋ท ํ๋ ฌ์ ์ด์ ๊ณฑํ๋ฉด์ ๊ฐ ์์๋ฅผ ์ ํ๋ ฌ์ ์ด, ์ฆ ๋ท ํ๋ ฌ์ ํ๋งํผ ๊ณฑํ๋ฏ๋ก ์ธ๊ฐ์ง ์๋ฅผ ๊ณฑํด์ฃผ๋ฉด ๋๋ค. ABC ์์๋ก ๊ณฑ์ ์ฐ์ฐ์ ํ์ ๋๋ AB๋ฅผ ๋จผ์ ๊ณฑํ ํ ๋์จ {(2, 4) => ํ์ด 2, ์ด์ด 4์ธ ํ๋ ฌ}๊ณผ C๋ฅผ ๊ณฑํ๊ฒ ๋๋ค.
ํด๋น ๋ฌธ์ ๋ ๋ชจ๋ ์ฐ์ฐ์ ์ํํด๋ณด๋ ์์ ํ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ ๋์ง๋ง, ๋ช๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ๊ฒน์ณ๋ณด์ธ๋ค. ์๋ฅผ๋ค์ด A,B,C,D 4๊ฐ์ ํ๋ ฌ์ด ์์ ๋ (AB)(CD)์ A(BCD) ์ฐ์ฐ ์ค CD๋ ์ด๋ฏธ ํด๋ ์ฐ์ฐ์ด๋ฏ๋ก ๋ค์ ํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ DP๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ์.
- ์ ์ฒด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋จ์ํํ๋ค.
- ํ๋ ฌ์ ๊ณฑ์ ๋ํ ์ฐ์ฐ ์๋ผ๋ ์ ์ฒด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋ ์ ์์๊น? ์ ์ฒด ํ๋ ฌ์ ๊ณฑ์ด ์์ ๋, 2๊ฐ์ ๋ถ๋ถ์ผ๋ก ๋๋๋ฉด ๋ ํ๋ ฌ์ ๋ง๋๋ ๋ฐ์ ๋๋ ์ฐ์ฐ์ ์ + ๋ ํ๋ ฌ์ ๊ณฑ์ ๋๋ ์ฐ์ฐ์ ์ ๋ก ์ ํ์์ ์ธ์ธ ์ ์๋ค.
์์ ๊ฐ์ (ํ,์ด)์ ๊ฐ์ง ํ๋ ฌ๋ค์ด ์์ ๋, ๋นจ๊ฐ ์ ๋ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ฉด ์์ชฝ ํ๋ ฌ์ ๊ฒฐ๊ณผ๋ (2,2) ํ๋ ฌ์ด๊ณ ๋ค์ชฝ ํ๋ ฌ์ ๊ฒฐ๊ณผ๋ (2,4) ํ๋ ฌ์ด๋ค. ๊ฐ๊ฐ์ ํ๋ ฌ์ด ๋ช ๋ฒ์ ์ฐ์ฐ์ ๊ฑฐ์ณ ๋ง๋ค์ด์ก๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ด ๋ ํ๋ ฌ์ 2*2*4
๋ฒ์ ์ฐ์ฐ์ผ๋ก ๊ณ์ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ๊ท์ ์ผ๋ก ์์ (2,2)ํ๋ ฌ์ด ์ต์ ๋ช ๋ฒ์ ์ฐ์ฐ์ผ๋ก ๋ง๋ค์ด์ง ์ ์๋์ง ๋ํ๋ผ ์ ์๋ค.
- ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ์ ํ์์ ๋ง๋ ๋ค.
// ์ ์
A(i) = d(i-1)*d(i)
M(i,j) = A(i)*A(i+1)*...*A(j)์ ์ต์ ์ฐ์ฐ ์
// ์ ํ์
M(i,j) = min ( M(i,k) + M(k+1,j) + d(i-1)d(k)d(j) )
// k๋ 1 ~ (j-1) ๊น์ง
// M(i,k) : k๊ฐ ๋นจ๊ฐ ๋ง๋์ด๊ณ , ์์ ํ๋ ฌ ๊ณฑ ์ฐ์ฐ ์๋ฅผ ๋ปํจ
// M(k+1,j) : ๋ค์ ํ๋ ฌ ๊ณฑ ์ฐ์ฐ ์๋ฅผ ๋ปํจ
// d(i-1)d(k)d(j) : ์/๋ค์ ํ๋ ฌ์ ๊ณฑํ ๋ ์ฐ์ฐ ์๋ฅผ ๋ปํจ
- ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ๋ต์ ์ ์ฅํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.
๋ต์ ํ๋ ฌ์ ๋ฉ๋ชจ์ด์ ์ด์ ํด๋ณด๊ฒ ๋ค.
ํ์ i๋ฅผ ๋ปํ๊ณ ์ด์ j๋ฅผ ๋ปํ๋ค. ํ์ํ ๊ณณ์ธ M(1,2)์ ์ต์๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์ ํ์์ ๋์ ํด๋ณด๋ฉด ์์ ๊ทธ๋ฆผ์์์ ๊ฐ์ด ๋์จ๋ค. ์ฌ๊ธฐ์ k๋ 1์์ 1๊น์ง์ด๋ฏ๋ก 1๋ง ํด๋นํ๋ค.
์ด ๊ทธ๋ฆผ์์ ํ๋์์ผ๋ก ํ์๋ ๋ถ๋ถ์ ๊ฐ์ ๊ตฌํ๋ ค๋ฉด ๊ฐ์ ์์ผ๋ก ํ์๋ ์นธ์ ๊ณฑํด์ ์ ํ์์ ๊ณ์ฐํ ํ, ๊ทธ ์ค ์ต์๊ฐ์ ์ฐพ์์ผํ๋ค. ์ ํ์์์ ํ์๋ถ๋ถ์ k๊ฐ 1์ผ ๋์ด๊ณ , ์ฐ๋์์ k๊ฐ 2์ผ ๋, ๋ ธ๋์์ k๊ฐ 3์ผ ๋์ด๋ค.
=> ์ด๋ ๊ฒ O(n^3) ์ง๋ฆฌ ๋ฐฐ์ด์ ๊ณฑ ๋ฌธ์ ๋ฅผ O(n)์ง๋ฆฌ ๋ฌธ์ ๋ก ํ๋ฐ๊ฟ ํ ์ ์๋ค.
- 0-1 ๋ฐฐ๋ญ ๋ฌธ์
- ๊ธฐํ ๋ฌธ์
์ฐธ๊ณ
https://ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EA%B3%84%ED%9A%8D%EB%B2%95
https://www.zerocho.com/category/Algorithm/post/584b979a580277001862f182
๋ถ์ ํํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ ์ ์์ต๋๋ค!
๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :)
Comment