공부하기/백준

[Python] 백준 풀기 11441 - 합 구하기

XEV 2023. 1. 2. 22:30

파이썬 백준 11441번

실버 3

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

 

 

 

 

 

 

문제 보기

분류: 누적 합

 

 

 

 

 

문제 풀기

주어진 모든 숫자들에 대하여 순차적으로 누적 합을 구하여 새 리스트에 저장을 한다. 예제 입력 1 의 경우 리스트의 index 를 맞추기 위해 0 으로 시작해서 0+10, 0+10+20, 0+10+20+30, ,,, 규칙으로 저장해 나간다.

결과적으로 i ~ j 의 합을 구하기 위해서는 새로이 저장된 리스트의 j 번째 값에서 i - 1 번째 값을 빼주는 형태로 답을 구한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline


def fnSumList():
    sum_to = 0
    # sum_ls = [0]
    for n in num_ls:
        sum_to += n
        sum_ls.append(sum_to)
    print(sum_ls)           # TEST PRINT

def fnSumFromIToJ(i, j):
    sumFromIToJ = sum_ls[j] - sum_ls[i - 1]
    print(f'sumFromIToJ: {sumFromIToJ}')            # TEST PRINT
    # print(sumFromIToJ)


if __name__ == "__main__":
    n = int(inputdata().strip())
    num_ls = list(map(int, inputdata().split()))
    
    sum_ls = [0]
    fnSumList()
    
    m = int(inputdata().strip())
    for _ in range(m):
        i, j = map(int, inputdata().split())
        
        fnSumFromIToJ(i, j)



# 5
# 10 20 30 40 50
# 5
# 1 3
# 2 4
# 3 5
# 1 5
# 4 4

# [0, 10, 30, 60, 100, 150]

# sumFromIToJ: 60
# sumFromIToJ: 90
# sumFromIToJ: 120
# sumFromIToJ: 150
# sumFromIToJ: 40