1. 조건

- Overlapping Subproblem: 문제를 작은 문제로 쪼갤 수 있고, 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다.

- Optimal Substructure: 문제의 정답을 작은 문제의 정답에서 구할 수 있기 때문에, 같은 문제는 구할 때마다 정답이 같다. 또한 작은 문제를 구했으면 어딘가에 메모를 해놓아야 한다.

 

2. 구현 방법

- Top-down

- Bottom-up

 

2.1 Top-down

- 재귀를 이용해서 푸는 방법이다.

- 풀이 과정 예시

① fibonacci(n)

② 문제를 작은 문제로 나눈다. fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)

③ 작은 문제를 푼다.

④ 작은 문제의 정답을 통해 큰 문제를 푼다.

public static int[] memo = new int[n+1];

public static int fibonacci(int n) {
	if(n<=1) { return 1; }
	else {
		if(memo[n]>0) { return memo[n]; }
        
		memo[n] = fibonacci(n-1)+fibonacci(n-2);

		return memo[n];
	}
}

 

2.2 Bottom-up

- 반복문을 이용해서 푸는 방법이다.

- 풀이 과정 예시

① 크기가 작은 문제부터 차례대로 푼다.

② 반복을 통해 큰 문제를 푼다.

public static int[] memo = new int[n+1];

public static int fibonacci(int n) {
	memo[0] = 0; memo[1] = 1;

	for(int i=2; i<=n; i++) { memo[i] = memo[i-1]+memo[i-2]; }

	return memo[n];
}

 

참고

- 『알고리즘 기초 1/2』

'Algorithm & Data Structure' 카테고리의 다른 글

Permutation  (0) 2022.03.04
Prime Number  (0) 2022.03.04
Greatest Common Divisor, Least Common Multiple  (0) 2022.03.04
Stack, Queue, Deque  (0) 2021.12.01
Time Complexity  (0) 2021.12.01