Skip to content

문제 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]=max(a[i],dp[i1]+a[i])

즉 지금까지의 합에 현재 값을 더한 것과, 여기서 새로 시작하는 것 중 큰 쪽을 택합니다. dp[i-1]이 음수라면 이어가는 것이 손해이므로 새로 시작합니다.

정답은 모든 dp[i] 중 최댓값입니다.

answer=maxidp[i]

예제 계산

배열 {1, -2, 3, 5, -4, 2, 5}에 대해 dp를 채우면

ia[i]dp[i-1]+a[i]dp[i] = max
011
1-21 + (-2) = -1-1 (이어감)
23-1 + 3 = 2 → a[i]=33 (새 시작)
353 + 5 = 88
4-48 + (-4) = 44
524 + 2 = 66
656 + 5 = 1111

dp = {1, -1, 3, 8, 4, 6, 11} 로 문제의 "최대 부분합" 열과 일치합니다. 이 중 최댓값이 정답이며, 이는 부분 배열 {3, 5, -4, 2, 5}의 합입니다.

max(dp)=11

👉 실습(C++)에서 Kadane 확인하기

PDF