알고리즘/백준
[백준 / #11659] 구간 합 구하기 4 (Python)
셩윤
2023. 11. 21. 19:02
문제 설명
https://www.acmicpc.net/problem/11659
11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j
www.acmicpc.net
문제풀이
DP를 공부하고 있으니 DP 문제인 걸 알았지만, 그냥 이 문제를 봤을 때 DP로 방향을 잡을 수 있을지는 모르겠다..
처음에는 2차원 DP로 풀었다. DP[i][j] 에 i부터 j까지의 합을 구해서
i == j ) DP[i][j] = num[j-1]
else) DP[i][j] = dp[i][j-1] + num[j-1]
당연하게도 시간초과가 나버림.. why? n이 100,000까지 가능 ㅋㅋ o(n^2)이면 10억..
그래서 생각을 해보니 1차원으로도 가능했다.
첫번째 수부터 각 인덱스 번째 수까지 더한 값을 저장하고 DP[j] - DP[i-1] 하면 쉽게 해결했다.?
나중에 보니 이게 ?prefix sum이라고 효율적으로 계산하는 방법이라더라 ㅋㅋ
이 방식 기억해 놓아야겠다!?
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
num = list(map(int, input().split()))
dp = [0 for _ in range(N+1)]
dp[1] = num[0]
for i in range(2, N+1):
dp[i] = dp[i-1] + num[i-1]
for _ in range(M):
i, j = map(int,input().split())
print(dp[j] - dp[i-1])