๐ค ๋์ ๊ณํ๋ฒ DP?
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์ ๋๋ค.
์ฆ, ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ด๋ ์ ๊ทผ ๋ฐฉ์์ ๋งํฉ๋๋ค.
๐ก ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค. ๋์ ๊ณํ๋ฒ์ ํต์ฌ์ด ๋๋ ๊ธฐ์ ์ด๋ค.
wikipedia
๋์ ๊ณํ๋ฒ(DP)์ ํต์ฌ์ด ๋๋ ๊ธฐ์ ๋ก ๊ฐ์ฅ ํฐ ํน์ง์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ํฅ์, ํํฅ์ ์ ๊ทผ ๋ฐฉ์์ ํตํด ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ์ด๋ฅผ ํด๊ฒฐํ๋ฉด์ ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ์ฆ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ์ค๋ณต ์ฐ์ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
๐ ์ํฅ์(bottom-up) ์ ๊ทผ
์์ ํ์ ๋ฌธ์ ๋ค๋ถํฐ ์์ํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ด์ฉํ์ฌ ์ ์ง์ ์ผ๋ก ํฐ ๋ฌธ์ ์ ๋ต์ ๊ตฌํด๋๊ฐ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
๐ ํํฅ์(top-down) ์ ๊ทผ
์ฌ๊ท ํธ์ถ์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ฃผ๋ก ์ฐ์ ๋๋ค.
์ฆ, ํฐ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
โ ๋์ ๊ณํ๋ฒ(DP) ์ ์ฉ ์กฐ๊ฑด
๐ ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblems)
DP๋ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋๊ณ , ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ ๊ณผ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ผํ ์์ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ DP๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
๐ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
์ฃผ์ด์ง ๋ฌธ์ ์ ์ต์ ์ ๋ต์ด ํ์ ๋ฌธ์ ์ ์ต์ ์ ๋ต์ ํตํด ์ป์ด์ง ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค.
๐ Example
public static int fibonacci(int n ){
if( n == 1 || n == 2){
return 1;
}
return fibonacci(n-1) + fibonacci(n - 2);
}
์ ์ฝ๋๋ ํผ๋ณด๋์น ์๋ฅผ ์ฌ๊ท ํธ์ถ์ ํตํด ๊ตฌํํด ๋ณด์์ต๋๋ค.
ํผ๋ณด๋์น ์์ด์ ์ด์ ๋ ์ซ์์ ํฉ์ ๋ค์ ์ซ์๋ก ๋ํ๋ด๋ ์์ด์ ๋๋ค.
๋ค์ ์ซ์๋ฅผ ์์๋ด๋ ค๋ฉด ์ด์ ์ซ์๋ค์ ํฉ์ ์์์ผ ํฉ๋๋ค ์ด ๊ณผ์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์ค๋ณต๋๋ ์ฐ์ฐ ์ฆ, ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฑธ ์ ์ ์์ต๋๋ค.
๋ํ ์ ์ฒด ๋ฌธ์ (fibonacci(5))์ ๋ต์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ๋ต์ ํตํด ์ป์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๋ ์กฐ๊ฑด์ ๋ง์กฑํจ์ผ๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ DP๋ฐฉ๋ฒ๋ก ์ ์ ์ฉํด ๋ณผ .
โ DP ๋ฌธ์
๋์ด๋ : ๋ธ๋ก ์ฆ 1 ๐ฅ
๋ฐฑ์ค 24416๋ฒ ํผ๋ณด๋์น ์ 1
24416๋ฒ: ์๊ณ ๋ฆฌ์ฆ ์์ - ํผ๋ณด๋์น ์ 1
์ค๋๋ ์์ค์ด๋ ๋์ ํ๋ก๊ทธ๋๋ฐ ์์ ์กฐ๊ต๋ฅผ ํ๊ณ ์๋ค. ์๋น ๊ฐ ์์ ํ ๋ด์ฉ์ ํ์๋ค์ด ์ ์ดํดํ๋์ง ๋ฌธ์ ๋ฅผ ํตํด์ ํ์ธํด๋ณด์. ์ค๋์ n์ ํผ๋ณด๋์น ์๋ฅผ ์ฌ๊ทํธ์ถ๊ณผ ๋์ ํ๋ก๊ทธ๋๋ฐ
www.acmicpc.net
n์ ํผ๋ณด๋์น ์๋ฅผ ์ฌ๊ท ํธ์ถ๊ณผ DP๋ฅผ ํตํด ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋น๊ตํ๊ธฐ ์ํด ๊ฐ ์ฝ๋๊ฐ ๋ช ๋ฒ ํธ์ถ๋๋์ง ํธ์ถ ํ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
DP๋ฐฉ๋ฒ๋ก ์ ์ ์ฉํ ์ฝ๋์ ๋๋ค.
bottom-up ์ ๊ทผ์ ํตํด ์์ ๋ฌธ์ ์ฆ, ํผ๋ณด๋์น ์์ ์ฒซ๋ฒ์งธ ์, ๋ ๋ฒ์งธ ์ ์ฐ์ฐ์ ์์์ผ๋ก ๊ฒฐ๊ด๊ฐ์ ์ ์ฅํ๋ฉด์ ์ ์ฅํ ๊ฒฐ๊ด๊ฐ์ ํตํด ์ค๋ณต ์ฐ์ฐ์ ์ค์ด๊ณ ์ ์ฐจ n๋ฒ์งธ ์๊น์ง ๊ฐ์ ๋์ถํด ๋ด๋ ๊ณผ์ ์ผ๋ก ์งํํฉ๋๋ค.
DP์ ํต์ฌ์ธ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํตํด์ ์ด์ ๊ฐ๋ค์ ์ ์ฅํ์ฌ ์ค๋ณต ์ฐ์ฐ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฐฐ์ด fibArr์ ์ฌ์ฉํฉ๋๋ค.
static void fibonacci(int n ){
// ํผ๋ณด๋์น ์์ ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ๋ 1์ด๊ธฐ ๋๋ฌธ์ 1๋ก ์ค์ ํด ์ค๋๋ค.
fibArr[0] = 1;
fibArr[1] = 1;
for( int i = 2; i<n; i++){
fibArr[i] = fibArr[i-1] + fibArr[i-2];
cnt++;
}
}
๐
๋ฌธ์ ์์๋ ํธ์ถ ํ์๋ฅผ ๋ฌป๊ณ ์๊ธฐ ๋๋ฌธ์ cnt๋ฅผ ์ถ๋ ฅํ์ง๋ง n๋ฒ์งธ์ ํผ๋ณด๋์น ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค๋ฉด fibArr[n-1]์ ํตํด ์ป์ ์ ์์ต๋๋ค. ( n=5 ์ผ ๋ fibArr = { 1, 1, 2, 3, 5 } )
๋ํ ๋ฌธ์ ์ ๋ฒ์๊ฐ n(5<= n <= 40)์ด๊ธฐ ๋๋ฌธ์ ์๊ด์์ง๋ง ๋ง์ฝ ๋ฒ์๊ฐ 1๋ถํฐ ์์์ด๋ผ๋ฉด ArrayIndexOutOfBoundsException์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋ ๋ฒ์๋ก ๋ฉ๋ชจ์ด์ ์ด์ ํ ๋ฐฐ์ด์ ์ ์ธํด์ฃผ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค. ( fibArr = new int[์ต๋๋ฒ์] )
๐ ์ ์ฒด ์ฝ๋
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.StringBuilder;
public class Main{
static int n, cnt;
static int[] fibArr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
fibArr = new int[n];
cnt = 0;
fib(n);
sb.append(cnt).append(" ");
cnt = 0;
fibonacci(n);
sb.append(cnt);
System.out.print(sb);
br.close();
}
static int fib(int n){
if( n == 1 || n == 2){
cnt++;
return 1;
} else {
return fib(n -1) + fib(n - 2);
}
}
static void fibonacci(int n ){
fibArr[0] = 1;
fibArr[1] = 1;
for( int i = 2; i<n; i++){
fibArr[i] = fibArr[i-1] + fibArr[i-2];
cnt++;
}
}
}
๐ Reference : https://velog.io/@boyeon_jeong/%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming