Algorithm/Online judge

[백준] 11441번 > 합 구하기

민철킹 2021. 3. 4. 15:15

www.acmicpc.net/problem/11441

 

11441번: 합 구하기

첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는

www.acmicpc.net

문제

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