구간 합을 구하는 문제이며, 주어진 수와 범위 내에서 인덱스가 주어졌을 때, 해당 구간 합을 출력하는 방식이다.
예)
5 3
5 4 3 2 1
1 3 --> 12 출력 (5+4+3)
2 4 --> 9 출력 (4+3+2)
5 5 --> 1 출력 (1)
구간 합에 대한 기본 개념을 까먹고 있었고, 주어진 범위를 그때마다 더하려고 했으나, N
과 M
의 범위가 1부터 10만까지임을 확인하고, 다른 방식으로 접근했다.
- 주어진 리스트의 요소들을 하나씩 더한 새로운 리스트를 만들자!
- 아무것도 더하지 않은 상태를 0으로 생각하고, [0]의 리스트를 생성한다.
- 주어진 수 리스트를 하나씩 더해 리스트에 추가한다.
예) 5 4 3 2 1 -> [0, 5, 9, 12, 14, 15] 생성
- 범위가 주어지면, (큰 인덱스 - (작은 인덱스 -1))을 수행한다.
-1을 수행하는 이유는 초기 값인 0이 포함되어 있기 때문이다.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
num_list = list(map(int, input().split()))
num_list_sum = [0]
sum_value = 0
for j in num_list:
sum_value += j
num_list_sum.append(sum_value)
for i in range(m):
a, b = map(int, input().split())
print(num_list_sum[b] - num_list_sum[a-1])