큰 문제를 작은 문제로 나눠서 푸는 알고리즘인데, 코딩테스트에서 자주 출제되는 알고리즘 기법입니다.
대표적인 예로 피보나치 수를 들 수 있다.
Fn = Fn-1 + Fn-2
여기서 Fn을 큰 문제로 생각하고, 우측 항에 있는 Fn-1, Fn-2를 작은 문제로 나눈다고 생각하면 된다.
문제의 정답을 작은 문제의 정답을 합하는 것으로 구할 수 있다.
위의 예에서 작은 문제로 쪼갠 우측항의 Fn-1 + Fn-2로 큰 문제인 Fn의 값을 구할 수 있다.
DP는 Optimal Substructure를 만족하기 때문에 작은 문제로 큰 문제의 정답을 구할 수 있다.
이때, 작은 문제의 정답을 메모해둔다. (코드에서는 배열로써 구현함)
int memo[100];
public int fibonacci(int n) {
if (n <= 1)
return n;
else if (n == 2)
return 1;
else {
if (memo[n] > 0)
return memo[n];
memo[n] = fibonacci(n-1) + fibonacci(n-2);
return memo[n];
}
}
재귀호출을 하는 방식으로 푼다.
int d[100];
public int fibonacci(int n) {
d[0] = 0;
d[1] = 1;
for (int i = 2; i <= n; i++) {
d[i] = d[i - 1] + d[i - 2];
}
return d[n];
}
마지막 오는 숫자를 케이스로 나눠서 푸는 문제
동전 2는 DP와 BFS로 풀 수 있는 문제이다. 두 가지 방법으로 풀어보는 것을 추천한다.
분할정복(Divide and Conquer) (0) | 2022.03.19 |
---|---|
완전탐색 (Brute-Force) (0) | 2022.03.19 |
[OS]프로세스(Process)와 스레드(Thread)의 차이/멀티 프로세스와 멀티 스레드의 개념 ,특징, 장단점 (0) | 2022.03.19 |
[OS]프로세스(Process)와 스레드(Thread)의 차이/멀티 프로세스와 멀티 스레드의 개념 ,특징, 장단점 (0) | 2022.03.19 |
[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 (0) | 2022.03.19 |