본문 바로가기

글/코딩

백준 알고리즘 문제 풀이 11659 : 구간 합 구하기 4

반응형

문제

수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.

출력

총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.

 


 

풀이과정

 

 이 문제도 직관적으로 풀어보자면, i부터 j까지의 모든 List를 더하는 for문으로 풀면 되지 않을까 싶었지만,

당연히 시간초과 문제가 발생했다.

 좀 더 찾아본 결과 이 문제에 대해서는 누적합이라는 개념으로 접근해야 한다는 것을 알게되었다.

 

누적합

 누적합 : 특정 List가 있을 때, 어떤 List index까지의 모든 합

어떤 구간의 합은 구간의 끝까지의 누적합과 구간 시작까지의 누적합의 차이와 같다.

 

누적합과 수열 사이 관계

 

따라서 누적합을 미리 구해둔 뒤, j번째 누적합에서 i번째 누적합을 빼는 방식만으로 수의 구간합을 빠르게 구할 수 있었다.

 

 

Code

import sys

n,m=map(int, input().split())
list_n=list(map(int, input().split()))
## 누적합
list_n_sum=[]
summ=0
for i in list_n:
    summ=summ+i
    list_n_sum.append(summ)

for k in range(m):
    i,j=sys.stdin.readline().split(" ")
    i=int(i)
    j=int(j)
    if i < 2:
        print(list_n_sum[j-1])
    else:
        print(list_n_sum[j-1]-list_n_sum[i-2])
반응형