누적합 알고리즘은 배열 또는 리스트의 각 원소까지의 누적 값을 빠르게 계산하는 기법입니다. 이를 통해 구간 합을 빠르게 구하거나 특정 구간의 합을 계산하는 등 다양한 연산을 효율적으로 수행할 수 있습니다. 주로 구간 합 문제나 부분합 문제를 해결하는 데 사용됩니다.

누적합 알고리즘의 주요 아이디어는 다음과 같습니다:

  1. 누적합 배열 생성: 주어진 배열의 각 원소까지의 누적 값을 저장하는 배열을 생성합니다. 이 배열의 크기는 원본 배열의 크기보다 1 큽니다. 누적합 배열의 첫 번째 값은 0이고, 두 번째 값은 원본 배열의 첫 번째 값, 세 번째 값은 원본 배열의 첫 번째와 두 번째 값의 합, 그리고 이어지는 값들은 이전 누적합과 현재 원본 배열 값의 합으로 구성됩니다.
  2. 누적합 계산: 누적합 배열을 한 번 생성하면 각 위치마다 누적합을 저장하고 있기 때문에, 어떤 구간의 합을 계산할 때에는 누적합 배열의 두 인덱스 차이를 이용하여 계산합니다. 예를 들어, 원본 배열의 1번부터 5번까지의 합을 구하려면 누적합 배열의 6번 인덱스 값에서 0번 인덱스 값을 뺀 값을 사용하면 됩니다.

누적합 알고리즘은 다음과 같은 점에서 유용합니다:

다음은 누적합 알고리즘의 간단한 예제 코드입니다 (Python을 기준으로 작성했습니다):

def prefix_sum(arr):
    n = len(arr)#배열의 길이
    prefix_sum_arr = [0] * (n + 1)

    for i in range(1, n + 1):
        prefix_sum_arr[i] = prefix_sum_arr[i - 1] + arr[i - 1]

    return prefix_sum_arr

# 누적합 배열을 생성합니다.
original_array = [1, 2, 3, 4, 5]
prefix_sum_array = prefix_sum(original_array)

# 2번부터 4번까지의 구간 합을 계산합니다.
start_index = 2
end_index = 4
interval_sum = prefix_sum_array[end_index] - prefix_sum_array[start_index - 1]

print("누적합 배열:", prefix_sum_array)
print("구간 합:", interval_sum)

누적합 알고리즘은 구간 합 문제나 부분합 문제와 같은 상황에서 효율적으로 사용될 수 있는 강력한 도구입니다.