https://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개의 줄에 걸쳐 입력으로 주어진 구간의 합을 출력한다.
코드 정답
import sys
input = sys.stdin.readline
# 11441
n = int(input())
li = list(map(int, input().split()))
# 누적 합 계산
li_sum = [0] * (n+1)
for i in range(1, n+1):
li_sum[i] = li_sum[i-1] + li[i-1]
m = int(input())
for a in range(m):
i, j = map(int, input().split())
# 범위 합 계산
print(li_sum[j] - li_sum[i-1])
풀이
입력을 빠르게 받기 위하여 아래 두 문장을 사용하여 sys.stdin.readline 을 사용할 수 있게 만들어주며, 그것을 input에 대입하여 input으로 sys.stdin.readline처럼 사용할 수 있게 만들었습니다.
import sys
input = sys.stdin.readline
이후 정수값 하나를 입력받아 변수 n에 저장하고, 다음 행에는 정수값을 n개 만큼 띄워쓰기를 기준으로 입력을 받아 그것을 각각의 인덱스에 담아 변수 li에 리스트 형식으로 만들어냅니다.
n = int(input())
li = list(map(int, input().split()))
이후 li에 저장된 값들을 이용해 필요한 값들을 계산하여 변수 li_sum에 저장을 하게 됩니다. 값 0이 저장되어 있는 인덱스를 n+1개 만들어 li_sum 변수에 저장합니다. 이후 1이 n+1이 될 때까지 반복을 하며 li_sum[i-1] + li[i-1] 이 계산된 값들을 li_sum[i]에 저장을 합니다. 이렇게 한다면 li_sum[1] 부터 li_sum[n]까지 필요한 값들이 순차적으로 저장이 됩니다.
li_sum = [0] * (n+1)
for i in range(1, n+1):
li_sum[i] = li_sum[i-1] + li[i-1]
정수값 하나를 입력받아 변수 m에 저장합니다. 이후 m번 반복을 하며 반복이 될 때마다 값 두 개를 입력받아 각각 변수 i와 j에 저장을 합니다. 이후 li_sum[j] 에서 li_sum[i-1]을 빼낸 값을 출력합니다.
m = int(input())
for a in range(m):
i, j = map(int, input().split())
print(li_sum[j] - li_sum[i-1])
'BaekJoon > 누적합' 카테고리의 다른 글
[백준] 부분합 - 1806번 문제 (Python) (0) | 2023.04.01 |
---|---|
[백준] 블로그 - 21921번 문제 (Python) (0) | 2023.03.31 |
[백준] 순서쌍의 곱의 합 - 13900번 문제 (Python) (0) | 2023.03.26 |
[백준] Maximum Subarray - 10211번 문제 (Python) (0) | 2023.03.24 |
[백준] 2차원 배열의 합 - 2167번 문제 (Python) (0) | 2023.03.23 |