이번에는 Prefix Sum(구간 합) 알고리즘에 대해 알아보자.
Prefix Sum은 배열의 구간 합을 효율적으로 계산하기 위한 방법으로, 특히 여러 번의 구간 합을 계산해야 할 때 매우 유용하다.
Prefix Sum 알고리즘은 배열에서 특정 구간의 합을 빠르게 계산하기 위해 사용된다.
일반적으로, 각 구간의 합을 직접 계산하면 O(n)의 시간이 걸리지만, Prefix Sum 배열을 미리 계산해 두면 O(1) 시간에 구간 합을 계산할 수 있다.
Prefix Sum 알고리즘은 다음과 같은 단계로 동작한다:
prefix[j] - prefix[i-1]
으로 간단히 계산할 수 있다.
Prefix Sum 배열을 미리 계산하는 데는 O(n)의 시간이 걸리며, 이후 구간 합을 계산하는 데는 O(1)의 시간이 소요된다.
여러 번 구간 합을 계산해야 할 때, 매우 효율적이다.
아래는 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)
}
}