Gihak111 Navbar

Prefix Sum

이번에는 Prefix Sum(구간 합) 알고리즘에 대해 알아보자.
Prefix Sum은 배열의 구간 합을 효율적으로 계산하기 위한 방법으로, 특히 여러 번의 구간 합을 계산해야 할 때 매우 유용하다.

Prefix Sum(구간 합) 개요

Prefix Sum 알고리즘은 배열에서 특정 구간의 합을 빠르게 계산하기 위해 사용된다.
일반적으로, 각 구간의 합을 직접 계산하면 O(n)의 시간이 걸리지만, Prefix Sum 배열을 미리 계산해 두면 O(1) 시간에 구간 합을 계산할 수 있다.

Prefix Sum의 동작 원리

Prefix Sum 알고리즘은 다음과 같은 단계로 동작한다:

  1. Prefix Sum 배열 계산
    주어진 배열의 각 원소까지의 합을 저장하는 새로운 배열을 생성한다.
  2. 구간 합 계산
    특정 구간 [i, j]의 합은 Prefix Sum 배열에서 prefix[j] - prefix[i-1]으로 간단히 계산할 수 있다.

    Prefix Sum의 시간 복잡도

    Prefix Sum 배열을 미리 계산하는 데는 O(n)의 시간이 걸리며, 이후 구간 합을 계산하는 데는 O(1)의 시간이 소요된다.
    여러 번 구간 합을 계산해야 할 때, 매우 효율적이다.

Prefix Sum 예제 코드

아래는 Prefix Sum 알고리즘을 구현한 간단한 예제 코드이다.
이 코드에서는 배열의 구간 합을 효율적으로 계산하기 위해 Prefix Sum 배열을 사용한다.

public class PrefixSumExample {

    // Prefix Sum 배열을 생성하는 함수
    public static int[] computePrefixSum(int[] arr) {
        int[] prefixSum = new int[arr.length];
        prefixSum[0] = arr[0];

        for (int i = 1; i < arr.length; i++) {
            prefixSum[i] = prefixSum[i - 1] + arr[i];
        }

        return prefixSum;
    }

    // 구간 [i, j]의 합을 계산하는 함수
    public static int rangeSum(int[] prefixSum, int i, int j) {
        if (i == 0) {
            return prefixSum[j];
        } else {
            return prefixSum[j] - prefixSum[i - 1];
        }
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 6, 8, 10};
        int[] prefixSum = computePrefixSum(arr);

        System.out.println("Sum of elements from index 1 to 3: " + rangeSum(prefixSum, 1, 3));  // 출력: 18 (4 + 6 + 8)
        System.out.println("Sum of elements from index 0 to 4: " + rangeSum(prefixSum, 0, 4));  // 출력: 30 (2 + 4 + 6 + 8 + 10)
    }
}

Prefix Sum 사용 사례