import sys
input = sys.stdin.readline
n,m = map(int ,input().split())
check = list(map(int, input().split()))
prefix_sum = [0]*(n+1)
answer = 0
for i in range(1,n+1):
prefix_sum[i] = prefix_sum[i-1] + check[i-1]
for _ in range(m):
a,b = map(int, input().split())
answer = prefix_sum[b] - prefix_sum[a-1]
print(answer)
처음 문제를 풀때는 구간별로 전부 수를 더하였지만, 시관초과가 나왔다.O(n^2)의 시간복잡도가 필요하기 때문에 시간초과가 나온것 같다.
그래서 누접합이라는 알고리즘을 사용했더니, 시간초과 오류를 해결할수 있었다. 누적합의 시간복잡도는 O(n)이다.
누적합(Prefix_sum) 알고리즘은 배열의 각 요소에 대해 그 이전까지의 모든 요소를 더한 값을 미리 계산해 저장하는 알고리즘이다.
위의 문제를 적용하게 되면,a구간부터 b구간 까지의 합을 구해야하는 문제이다.
이문제에서 b까지 더한 구간에서 a까지 더한 구간을 빼주게 된다면, a~b이 나오게 된다.
'코딩테스트' 카테고리의 다른 글
백준 숫자 카드 2 PYTHON (0) | 2024.08.16 |
---|---|
백준 순서쌍의 곱의 합 13900 PYTHON (0) | 2024.08.13 |
백준 최대힙 11279 (0) | 2024.08.09 |
백준 9012 스택 PYTHON (0) | 2024.08.08 |
백준 1620번 - 나는야 포켓몬 마스터 이다솜 PYTHON (0) | 2024.08.03 |