알고리즘

[알고리즘] 다이나믹 프로그래밍

예은파파 2020. 9. 24. 23:39

 

다이나믹 프로그래밍 (Dynamic Programming)

 

큰 문제를 작은 문제로 나눠서 푸는 알고리즘 기법

 

1. Overlapping Subproblem

 - 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다.

 - 문제를 작은 문제로 쪼갤 수 있다.

 

2. Optimal Substructure

 - 문제의 정답을 작은 문제의 정답에서 구할 수 있다.

 - 문제의 정답을 작은 문제의 정답을 합하는 것으로 구할 수 있다.

 

• 다이나믹 프로그래밍에서 각 문제는 한 번만 풀어야 한다. 

• Optimal Substructure를 만족하기 때문에, 같은 문제는 구할 때 마다 정답이 같다. 

• 따라서, 정답을 한 번 구했으면, 정답을 어딘가에 메모해놓는다.

• 이런 메모하는 것을 코드의 구현에서는 배열에 저장하는 것으로 할 수 있다.

• 메모를 한다고 해서 영어로 Memoization이라고 한다. 

 

피보나치 수 

Fn = Fn-1 + Fn-2 (n≥2)

 

피보나치수(5)를 호출한 경우 어떻게 호출되는지를 나타낸 그림

한번 답을 구할 때, 어딘가에 메모를 해놓고, 중복 호출이면 메모해놓은 값을 리턴한다. 

 

import java.util.Scanner;

public class Main {

	static int [] memo = new int[100];
	
	public static int fibonacci( int n ) {
		
		if( n < 2 ) {
			
			return n;
			
		} else {
			
			if( memo[n] > 0 ) {
				
				return memo[n];
				
			} else {
				
				memo[n] = fibonacci( n-1 ) + fibonacci( n-2 );
				return memo[n];
			}
		}
		
		
	}
	
	public static void main( String[] args ) {
		
		Scanner sc = new Scanner( System.in );
		
		int fibo = sc.nextInt();
		
		int result = fibonacci( fibo );
			
		System.out.println( result );
		
	}
}

'알고리즘' 카테고리의 다른 글

[알고리즘] 2. 큐 와 덱  (0) 2020.09.19
[알고리즘] 1. 스택  (0) 2020.06.26