https://www.acmicpc.net/problem/11659
누적합 방식
import sys
n,m = map(int,sys.stdin.readline().split())
arr = list(map(int,sys.stdin.readline().split()))
prefix_sum = [0]
for i in range(n):
prefix_sum.append(prefix_sum[i] + arr[i])
for _ in range(m):
i,j = map(int,sys.stdin.readline().split())
sub_sum = prefix_sum[j] - prefix_sum[i - 1]
print(sub_sum)
다른 풀이 (boj book)
n,m = map(int,sys.stdin.readline().split())
arr = [0] + list(map(int,sys.stdin.readline().split()))
dp = [0] * (n + 1)
for i in range(1, n + 1):
dp[i] = dp[i - 1] + arr[i]
for _ in range(m):
i,j = map(int,sys.stdin.readline().split())
print(dp[j] - dp[i - 1])
시간초과 코드 O(n * m) - 구간합 방식
import sys
n,m = map(int,sys.stdin.readline().split())
arr = list(map(int,sys.stdin.readline().split()))
for _ in range(m):
i,j = map(int,sys.stdin.readline().split())
sum = 0
for idx in range(i- 1, j):
sum += arr[idx]
print(sum)
📚 누적합 알고리즘 (Prefix Sum Algorithm)은 배열에서 특정 구간의 합을 효율적으로 계산하기 위한 기법입니다. 배열의 각 요소까지의 누적된 합을 계산하여 저장해두고, 이를 이용하여 구간 합을 O(1) 시간에 구할 수 있습니다.