IT/알고리즘
동적계획법 (Dynamic Programing) 알고리즘
binary?
2024. 3. 31. 17:45
728x90
동적계획법 (Dynamic Programing) 알고리즘 - DP
동적계획법 (Dynamic Programing) 알고리즘 - DP
복잡한 문제를 여러 개의 간단한 문제로 분리하여 부분의 문제들을 해결함으로써 최종적으로 복잡한 문제의 답을 구하는 방법
메모제이션 기법
모든 작은 문제들은 한번만 계산해 DP 테이블에 저장하여 추후 재사용할 때는 이 DP테이블을 이용한다.
동적계획법의 가장 대표적인 문제 -> 피보나치 수열
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.

※ 출처 인프런 강의 (Do it! 알고리즘 코딩테스트 with JAVA)
F[5]를 구해야한다면 F[4]와 F[3]이 필요하다.
F[4]를 구해야한다면 F[3]와 F[2]이 필요하다.
F[3]를 구해야한다면 F[2]와 F[1]이 필요하다.
F[2]를 구해야한다면 F[1]와 F[0]이 필요하다.
동적계획법 구현하는 첫번째 방식 : 톱-다운 방식
public class P2747_TopDown {
static int[] D;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
D = new int[n + 1];
for (int i = 0; i <= n; i++) {
D[i] = -1;
D[0] = 0;
D[1] = 1;
fibo(n);
System.out.println(D[n]);
static int fibo(int n) {
if (D[n] != -1) // 기존에 계산한 적이 있는 부분의 문제는 재계산하지 않고 리턴
return D[n];
return D[n] = fibo(n - 2) + fibo(n - 1);
// 메모이제이션: 구한 값을 바로 리턴하지 않고 DP 테이블에 저장한 후 리턴하도록 로직을 구현
동적계획법 구현는 두번째 방식 : 바텀-업 방식
public class P2747_TopDown {
static int[] D;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
D = new int[n + 1];
for (int i = 0; i <= n; i++) {
D[i] = -1;
D[0] = 0;
D[1] = 1;
for (int i = 2; i <= n; i++) {
D[i] = D[i - 1] + D[i - 2];
System.out.printin(D[n]);
}
}
톱-다운 방식은 재귀함수의 형태로 되어 있기 때문에 깊이가 매우 깊어질 경우 런타임 에러가 발생할 수 있다.
따라서 톱-다운 방식보다는 바텀-업 방식이 좀 더 안전하다고 볼 수 있다.
728x90