Algorithm/ํญํด99(4๊ธฐ)
99ํด๋ฝ ์ฝํ ์คํฐ๋ 30์ผ์ฐจ TIL : Dynamic Programming(๋ฐฑ์ค- ์์๋ฃ๊ธฐ)
_dear
2024. 11. 27. 10:50

๐ ๋ฌธ์


https://www.acmicpc.net/problem/9461
๐ก ํ์ด
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static Long[] arr= new Long[100];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb= new StringBuilder();
int T= Integer.parseInt(br.readLine());
for(int i=0;i<T;i++) {
int n= Integer.parseInt(br.readLine());
sb.append(p(n)+"\n");
}
System.out.println(sb);
}
private static Long p(int n) {
if(n>=1&&n<=3) {
return 1L;
}else if(n>=4&&n<=5) {
return 2L;
}else if(arr[n-1]==null){
arr[n-1]= p(n-1)+p(n-5);
}
return arr[n-1];
}
}
๐ ์ค๋์ ํ๊ณ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming, DP)
: ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋จ์ํ ํ์ ๋ฌธ์ ๋ก ๋๋๊ณ , ๊ฐ ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ๋์ผํ ํ์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐํ์ง ์๋๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ
- ์ผ๋ฐ์ ์ผ๋ก ์ค๋ณต๋ ๊ณ์ฐ๊ณผ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ํ์ฉ
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
๋ฌธ์ ์ ์ต์ ํด๊ฒฐ์ฑ ์ด ํ์ ๋ฌธ์ ๋ค์ ์ต์ ํด๊ฒฐ์ฑ ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ ์ฑ์ง
์: ํผ๋ณด๋์น ์์ด์์ F(n) = F(n-1) + F(n-2) - ์ค๋ณต๋๋ ํ์ ๋ฌธ์ (Overlapping Subproblems)
๋์ผํ ํ์ ๋ฌธ์ ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ์ด ๊ฒฝ์ฐ, ์ค๊ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉด ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.
์: ์ฌ๊ท์ ์ผ๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํ ๋, ๋์ผํ ๊ณ์ฐ์ด ์ฌ๋ฌ ๋ฒ ๋ฐ์. - ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)
ํํฅ์(Top-Down) ์ ๊ทผ ๋ฐฉ์์ผ๋ก, ์ด๋ฏธ ๊ณ์ฐํ ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ(๋ฐฐ์ด ๋ฑ)์ ์ ์ฅํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ๋ค. - ํ๋ทธ๋ ์ด์
(Tabulation)
์ํฅ์(Bottom-Up) ์ ๊ทผ ๋ฐฉ์์ผ๋ก, ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ด๋๊ฐ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.