티스토리 뷰
728x90
반응형
Kadane's Algorithm은 배열에서 연속된 요소들의 부분 배열 중 가장 큰 합을 찾는 효율적인 알고리즘입니다. 이 알고리즘은 O(n) 시간 복잡도로 동작하므로, 배열을 한 번만 순회하여 문제를 해결할 수 있습니다. 문제는 주로 "최대 부분 배열 합" (Maximum Subarray Sum) 문제라고 불립니다.
알고리즘 설명:
- 배열의 각 요소를 차례대로 살펴보며, 현재 위치까지의 최대 부분 배열 합을 계산합니다.
- 부분 배열의 합이 음수로 떨어지면 그 이전의 부분 배열은 버리고, 새로운 부분 배열을 시작합니다.
- 결국 가장 큰 부분 배열의 합을 찾아냅니다.
원리:
- 현재까지의 최대 부분 합(
max_ending_here
)을 유지합니다. - 최대 전체 합(
max_so_far
)을 유지합니다. - 각 단계에서 현재까지의 최대 부분 합을 갱신하고, 이를 최대 전체 합과 비교하여 더 큰 값을 저장합니다.
단계:
- 배열을 순회하면서 각 요소를 더하여 현재까지의 부분 합을 계산합니다.
- 만약 현재 부분 합이 음수가 되면, 이전의 부분 배열을 버리고 새로운 부분 배열을 시작합니다.
- 그 과정에서 최대 부분 합을 갱신합니다.
예시:
배열이 [-2,1,-3,4,-1,2,1,-5,4]
일 때,
- 부분 배열
[4,-1,2,1]
의 합은6
이므로 최대 부분 배열의 합은6
입니다.
코드 구현 (Java):
class Solution {
public int maxSubArray(int[] nums) {
// 배열의 첫 번째 값으로 초기화
int maxSoFar = nums[0]; // 최대 전체 합
int maxEndingHere = nums[0]; // 현재까지의 최대 부분 합
// 배열을 순회하면서 최대 부분 배열 합을 구함
for (int i = 1; i < nums.length; i++) {
// 현재 값(nums[i])을 더한 부분 배열과, 새롭게 시작하는 부분 배열 중 더 큰 것을 선택
maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
// 전체 중에서 가장 큰 부분 배열 합을 갱신
maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
return maxSoFar; // 최대 부분 배열 합 반환
}
}
동작 과정:
maxEndingHere
: 현재까지의 부분 배열의 최대 합을 유지합니다. 새로운 요소를 추가할 때마다maxEndingHere
를 갱신합니다.maxSoFar
: 전체에서 가장 큰 부분 배열 합을 유지합니다.maxEndingHere
가 갱신될 때마다maxSoFar
도 갱신됩니다.
예시 실행:
int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
Solution solution = new Solution();
System.out.println(solution.maxSubArray(nums)); // 출력: 6
시간 복잡도:
- O(n): 배열을 한 번만 순회합니다.
공간 복잡도:
- O(1): 추가적인 배열을 사용하지 않고 상수 공간만 사용합니다.
요약:
Kadane's Algorithm은 연속된 부분 배열의 합을 효율적으로 계산하여, 최대 부분 배열의 합을 찾는 매우 빠른 알고리즘입니다. 시간 복잡도가 O(n)이므로 큰 배열에서도 빠르게 동작합니다.
728x90
반응형
'Algorithm' 카테고리의 다른 글
Priority Queue 우선순위큐 (5) | 2024.10.09 |
---|---|
Heap 힙 (0) | 2024.10.09 |
Divide and Conquer vs. Dynamic Programming (0) | 2024.09.22 |
Trie (트라이) (0) | 2024.08.31 |
위상 정렬 (Topological Sort) (0) | 2022.10.01 |
반응형
300x250