๐ค ๋์ ๊ณํ๋ฒ 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
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