반응형
문제 설명
입출력 예제
풀이 코드
이 문제는 현대오토에버 코딩문제에 나온 문제라고 한다.
사실상 실버난이도인 만큼 접근만 한다면 쉽게 풀 수 있는 문제다.
제한 사항을 보면 N, M 입력값의 제한 범위가 100,000이다.
이중 반복문으로 풀면 쉽게 풀수는 있겠지만 2중 반복문은 O(n^2) 시간 복잡도를 갖기 때문에 시간초과가 발생한다.
따라서 O(N)이나 O(logN)의 시간 복잡도로 풀어야 하는데
문제에서도 이미 정답을 말해줬다."구간합"
문제를 푸는 방법은 다음과 같다.
- 주어진 값들의 누적합을 갖는 리스트를 만든다. PrefixSum
- 여기서 PrefixSum에 0을 넣어 놓은 이유는 주어지는 구간 i가 1부터 시작하기 때문에 인덱싱에러를 방지하기 위해서이다.
- 각 수들의 합을 갖는 변수 total을 prefixSum에 추가하여 누적합 리스트를 완성한다.
- 구한 누적합들을 이용해 구간 합을 구하는 공식 prefixSum[rifght] - prefixSum[left - 1] 을 사용해 구간합을 구한다.
정답 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split()) # 개수, 합
nums = list(map(int, input().split()))
total = 0 # 각 수의 합 저장
prefixSum = [0] # 구간합 저장 리스트
for i in nums:
total += i
prefixSum.append(total)
for _ in range(m):
i, j = map(int, input().split())
print(prefixSum[j] - prefixSum[i - 1])