동적 프로그래밍(Dynamic Programming, DP)
부분해를 사용하여 복잡한 문제를 더 작은 부분 문제로 나누어 해결하고, 이러한 부분 문제의 해결 결과를 저장하여
전체 문제를 해결하는 알고리즘 기법이다. 특히 중복된 부분 문제와 최적 부분 구조를 가진 문제에 쓰인다.
동적 프로그래밍의 기본 개념
- 중복 부분 문제 (Overlapping Subproblems)
- 문제를 해결하는 과정에서 같은 부분 문제가 여러 번 발생한다.
- 동적 프로그래밍은 이러한 중복 계산을 피하기 위해 부분 문제의 결과를 저장한다.
- 최적 부분 구조 (Optimal Substructure)
- 전체 문제의 최적해는 부분 문제의 최적해로 구성된다.
- 큰 문제의 최적해는 작은 문제의 최적해를 기반으로 한다.
동적 프로그래밍의 접근 방법
- 탑다운 접근 (Top-Down Approach):
- 재귀적 해결: 문제를 재귀적으로 해결하면서 중복 계산을 방지하기 위해 결과를 저장한다.
- 메모이제이션 (Memoization): 부분 문제의 결과를 저장하는 기술로, 이미 계산된 값을 재사용한다.
- 바텀업 접근 (Bottom-Up Approach):
- 반복적 해결: 가장 작은 부분 문제부터 해결하여 결과를 저장하고, 점점 큰 문제로 확장한다
- 테이블화 (Tabulation): DP 테이블을 사용하여 모든 부분 문제의 결과를 저장하고 사용한다
장점:
중복 계산 방지 | 부분 문제의 결과를 저장하고 재사용하여 같은 문제를 여러 번 계산하지 않는다 |
다항 시간 복잡도 | 문제를 다항 시간 복잡도로 해결할 수 있는 경우가 많음. 예: 피보나치 수열 O(n) |
정확한 최적해 보장 | 부분 문제의 최적해를 기반으로 전체 문제의 최적해를 보장한다 |
문제 구조 명확화 | 문제를 작은 부분 문제로 나누어 해결하므로 문제의 구조와 관계를 명확히 이해할 수 있다 |
효율적인 구현 | 메모이제이션(탑다운)과 테이블화(바텀업) 방법을 통해 효율적으로 문제를 해결할 수 있다 |
단점:
메모리 사용량 증가 | 부분 문제의 결과를 저장하기 위해 많은 메모리를 사용한다 문제의 크기와 부분 문제의 수에 따라 메모리 사용이 많아질 수 있다 |
문제의 구조에 제한적 | 중복 부분 문제와 최적 부분 구조를 가진 문제에만 적합하다 이러한 조건이 충족되지 않는 문제에서는 다른 알고리즘이 더 적합할 수 있다 |
구현 복잡성 | 문제의 상태와 전이 관계를 정확하게 정의해야 하므로 구현이 복잡할 수 있다 |
사전 계산 시간 | 모든 부분 문제를 해결해야 하므로 초기 계산에 시간이 소요될 수 있다 |
'자료구조 > 알고리즘 기초수학' 카테고리의 다른 글
백트래킹 (Backtracking) (0) | 2024.08.12 |
---|---|
비트마스크 (Bit Mask) (0) | 2024.08.12 |
그래프 탐색 (0) | 2024.08.12 |
재귀와 완전탐색 (0) | 2024.08.06 |
StringBuilder와 StringTokenizer 비교 (0) | 2024.07.18 |