본문 바로가기
Algorithm

[구현/수학] 백준 11659 구간 합 구하기 4 - Python

by jangThang 2022. 2. 14.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    11659번: 구간 합 구하기 4

    첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     길이 N의 수열이 주어졌을 때, 구간 합을 구하는 문제입니다.

     

    2022.01.19 - [Algorithm] - [Algorithm] 단골 1번 문제, 구현 / 수학

     

    [Algorithm] 단골 1번 문제, 구현 / 수학

    [ Contents ] 1. 구현  단순히 '구현'만 하면 되는 문제 유형입니다. 문제를 이해하고 입력에 맞춰 적절한 출력만 하면 됩니다. 특별한 알고리즘이나 프로그래밍적 기법 없이, 단순 제어문만 사용하

    star7sss.tistory.com

     단순히 매번 구간 합을 구하면 '시간 초과'가 납니다. M이 최대 100000이기 때문에, 구간 합을 미리 구해서 동일한 계산을 반복하지 않도록 해야 합니다.

     

    수열 3 5 2 1 3 -1
    처음부터
    자신까지의 합
    [누적 합]
    3 8 10 11 14 13

     방법은 간단합니다. 미리 누적 합을 구해둡니다. 그리고 i부터 j까지의 구간 합을 [ j까지의 누적 합 - (i-1)까지의 누적 합] 으로 구합니다. 

     간단한 수학 트릭이지만, 요즘은 SW적성검사 등에서도 자주 나오니 알아두시면 좋습니다.

     

     

     

    3. 코드

    import sys
    input = sys.stdin.readline
    
    # 입력
    N, M = map(int, input().split())
    numlist = list(map(int, input().split()))
    
    # 누적 합 구하기
    sumlist = [0]
    _sum = 0
    for i in range(N):
        _sum += numlist[i]
        sumlist.append(_sum)
    
    # 구간 합 출력
    for _ in range(M):
        start, end = map(int, input().split())
        print(sumlist[end] - sumlist[start-1])

     0부터 N까지의 누적 합을 구해 리스트에 저장합니다.

     i부터 j까지의 구간 합은 [ j까지의 누적 합 - (i-1)까지의 누적 합 ] 으로 구합니다.

     

    star가 되고나서 Tistory

    반응형

    댓글