문제 8 · Kadane 알고리즘
문제 8 [3점]
동적 계획법dynamic programming을 이용하여 최대 부분 배열maximum subarray을 찾는 Kadane's Algorithm에 대해 서술하세요. 아래 예제 배열과 부분합을 사용해도 좋습니다.
배열: { 1, -2, 3, 5, -4, 2, 5 }
최대 부분합: { 1, -1, 3, 8, 4, 6, 11 }풀이 및 해설
아이디어
배열에서 연속된 부분 배열의 합 중 최댓값을 구하는 문제입니다. 모든 구간을 다 보면 O(n²)이지만, Kadane 알고리즘은 각 위치에서 "여기서 끝나는 최대 부분합"만 이어 계산해 O(n) 에 풉니다.
핵심 점화식은 다음과 같습니다. dp[i]를 "인덱스 i에서 끝나는 최대 부분합"으로 정의하면
즉 지금까지의 합에 현재 값을 더한 것과, 여기서 새로 시작하는 것 중 큰 쪽을 택합니다. dp[i-1]이 음수라면 이어가는 것이 손해이므로 새로 시작합니다.
정답은 모든 dp[i] 중 최댓값입니다.
예제 계산
배열 {1, -2, 3, 5, -4, 2, 5}에 대해 dp를 채우면
| i | a[i] | dp[i-1]+a[i] | dp[i] = max |
|---|---|---|---|
| 0 | 1 | — | 1 |
| 1 | -2 | 1 + (-2) = -1 | -1 (이어감) |
| 2 | 3 | -1 + 3 = 2 → a[i]=3 | 3 (새 시작) |
| 3 | 5 | 3 + 5 = 8 | 8 |
| 4 | -4 | 8 + (-4) = 4 | 4 |
| 5 | 2 | 4 + 2 = 6 | 6 |
| 6 | 5 | 6 + 5 = 11 | 11 |
dp = {1, -1, 3, 8, 4, 6, 11} 로 문제의 "최대 부분합" 열과 일치합니다. 이 중 최댓값이 정답이며, 이는 부분 배열 {3, 5, -4, 2, 5}의 합입니다.