문제
N개의 수 A1, A2, ..., AN이 입력으로 주어진다. 총 M개의 구간 i, j가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는 각 구간을 나타내는 i와 j가 주어진다. (1 ≤ i ≤ j ≤ N)
출력
총 M개의 줄에 걸쳐 입력으로 주어진 구간의 합을 출력한다.
예제 입력 1
5
10 20 30 40 50
5
1 3
2 4
3 5
1 5
4 4
예제 출력 1
60
90
120
150
40
예제 입력 2
3
1 0 -1
6
1 1
2 2
3 3
1 2
2 3
1 3
예제 출력 2
1
0
-1
1
-1
0
풀이
import sys
n = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline())
m_list = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]
cum = [num_list[0]]
for i in range(1, n):
cum.append(cum[-1]+num_list[i])
for i, j in m_list:
if i == 1:
print(cum[j-1])
else:
print(cum[j-1]-cum[i-2])
sum과 같은 계산 함수를 사용하면 시간 초과가 발생한다.
{A1, A2, ... , An}이 있을 때, Si = A1 + A2 + ... + Ai라고 하면,
Ai + Ai + 1 + ... + Aj - 1 + Aj는 Sj - S(i - 1)로 표현할 수 있다는 논리로 구현해야한다.
즉 누적합들을 배열에 저장해놓고 구간을 보며 시작 구간이 1이 아닐 경우에는 앞의 구간을 빼준다.
1~4 라면 그냥 4까지의 누적합 출력
2~4라면 4까지의 누적합 - 1까지의 누적합
반응형
'Algorithm > Online judge' 카테고리의 다른 글
[백준] 1431번 > 시리얼 번호 (0) | 2021.03.04 |
---|---|
[백준] 13241번 > 최소공배수 (0) | 2021.03.04 |
[백준] 10972번 > 다음 순열 (0) | 2021.03.03 |
[백준] 2512번 > 예산 (0) | 2021.03.03 |
[백준] 1051번 > 숫자 정사각형 (0) | 2021.03.03 |