728x90
반응형
SMALL
카데인 알고리즘 (Kadane's Algorithm) ?
배열 내의 연속된 부분 배열의 합 중에서 합이 최대인 부분 배열을 찾는 알고리즘이다.
배열을 한 번 순회하면서 현재 위치에서 끝나는 가장 큰 부분 배열의 합을 계산하고 이를 통해 전체 배열에서의 최대 부분 배열 합을 구하는 방식이다.
이 알고리즘은 시간 복잡도가 O(n), 공간 복잡도가 O(1)로 매우 효율적이다.
또한 1차원 배열뿐만 아니라 2차원 배열에서도 적용할 수 있다.
2차원 배열에서 최대 합을 갖는 부분 행렬을 찾는 문제는 복잡하지만 알고리즘을 행별로 적용하여 문제를 1차원 문제로 축소함으로써 해결할 수 있다.
핵심 아이디어
카데인 알고리즘은 다음과 같은 두 가지 값을 사용한다.
- 현재까지의 최대 부분 배열 합 (current_max) : 특정 위치까지의 최대 부분 배열 합
- 전체 최대 부분 배열 합 (global_max) : 현재까지의 모든 위치에서 가장 큰 최대 부분 배열 합
알고리즘 단계
- 배열의 첫 번째 원소로 current_max와 global_max를 초기화
- 배열의 두 번째 원소부터 끝까지 순회하며 다음을 반복
- 현재 원소를 포함하는 것이 좋을지 아니면 새로 시작하는 것이 더 나은지를 판단하여 current_max를 업데이트
즉 current_max = max(현재 원소, current_max + 현재 원소) - global_max는 current_max와 비교하여 더 큰 값으로 업데이트
- 현재 원소를 포함하는 것이 좋을지 아니면 새로 시작하는 것이 더 나은지를 판단하여 current_max를 업데이트
- 모든 요소에 대해 반복이 끝나면 global_max = 최대 부분 배열의 합
코드 예제
def kadane(arr):
# 배열의 첫 번째 원소로 초기화
current_max = global_max = arr[0]
# 배열의 두 번째 원소부터 끝까지 순회
for num in arr[1:]:
# 현재 원소를 포함할지 새로 시작할지 결정
current_max = max(num, current_max + num)
# 전체 최대값 갱신
global_max = max(global_max, current_max)
return global_max
arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(kadane(arr)) # 6
동작 과정 예시
배열: [3, -2, 5, -1]
인덱스 | 요소 | current_sum 계산 | global_sum 갱신 |
0 | 3 | current_sum = 3 | global_sum = 3 |
1 | -2 | current_sum = max(-2, 3 + (-2)) = 1 | global_sum = 3 |
2 | 5 | current_sum = max(5, 1 + 5) = 6 | global_sum = 6 |
3 | -1 | current_sum = max(-1, 6 + (-1)) = 5 | global_sum = 6 |
728x90
반응형
LIST
'알고리즘' 카테고리의 다른 글
[자료구조] 힙, heap 사용법 (0) | 2024.12.14 |
---|---|
[알고리즘] DFS와 BFS (0) | 2024.08.08 |
[알고리즘] 이분 / 이진 탐색 (Binary Search) 알고리즘 (0) | 2024.07.25 |
[알고리즘] 그리디 알고리즘 (Greedy Algorithm) (0) | 2024.07.17 |
[알고리즘] 최대공약수와 최소공배수 구하기, 유클리드 호제법 (0) | 2024.01.30 |