라떼는말이야

[solved.ac 실버3] 11659_구간 합 구하기 4 (DP 풀이) 본문

알고리즘/코딩 테스트

[solved.ac 실버3] 11659_구간 합 구하기 4 (DP 풀이)

MangBaam 2021. 9. 20. 03:26
반응형

제한 사항

문제

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

입력

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

출력

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

제한

  • 1 ≤ N ≤ 100,000
  • 1 ≤ M ≤ 100,000
  • 1 ≤ i ≤ j ≤ N

예제

 


 

나의 풀이

DP로 풀이했다.

DP 테이블에는 해당 위치까지의 누적 합이 저장된다.

예를 들어 1, 2, 3, 4, 5가 있을 때 DP테이블인 d에는 [1, 3, 6, 10, 15] 가 저장되는 것이다.

만약 2번 인덱스부터 4번 인덱스까지 구간 합을 구하고 싶다면 d[4] - d[1]을 하면 된다.

이 의미는 5번째 숫자까지의 누적 합에서 1번째 숫자까지의 누적 합을 뺀다는 뜻이다.

 

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
nums = map(int, input().split())
d = [0] * (n+1)
for i, n in enumerate(nums):
    d[i+1] = d[i] + n

for _ in range(m):
    a, b = map(int, input().split())
    print(d[b] - d[a-1])

이 문제처럼 테스트 케이스 개수를 입력 받는 경우엔 입력이 아주 많아질 수 있으므로 sys.stdin.readline을 사용한다.

(단, jupyter notebook에서는 먹히지 않으니 주피터에서 테스트 할 때는 위 두 줄을 주석처리하면 된다.)

 

테스트 결과

반응형
Comments