DSData StructuresPython learning path
0 / 12 완료
LESSON 07

누적합

한 번 미리 계산해 수많은 구간 합을 즉시 구하는 패턴

왜 누적합을 쓸까요?

같은 배열에서 구간 합 질문이 반복되면 매번 더하는 일을 없앨 수 있습니다. O(n)의 전처리 한 번으로 각 쿼리를 O(1)에 답하는 대표적인 시간-공간 교환입니다.

LIFE EXAMPLE

생활 속에서 먼저 이해해 볼까요?

코드를 생각하지 말고, 아래 상황이 어떤 순서로 움직이는지만 따라가 보세요.

현실 예시 1

전기 계량기

오늘 계량기 숫자에서 지난달 시작일 숫자를 빼면 그 기간에 쓴 전기를 알 수 있습니다.

자료구조와 연결하면매일의 사용량을 다시 더하지 않고 두 누적값의 차이만 구합니다.
현실 예시 2

저금통 누계

매일 돈을 넣은 뒤 현재까지 총액을 적어두면 월요일부터 수요일까지 모은 돈은 수요일 누계에서 일요일 누계를 빼면 됩니다.

자료구조와 연결하면구간의 앞부분을 빼서 원하는 기간만 남기는 누적합 원리입니다.

실무에서는 이렇게 씁니다

코딩 테스트의 장난감 예제를 넘어, 실제 시스템에서 같은 원리가 어디에 숨어 있는지 연결해 보세요.

01

대시보드

날짜 범위별 요청 수·매출 합을 빠르게 계산합니다.

02

이미지 처리

2차원 누적합으로 사각 영역의 픽셀 합을 구합니다.

03

분석 쿼리

여러 구간의 평균과 변화량을 반복 계산합니다.

04

전기 요금

매일의 사용량 누계로 임의 기간의 총사용량을 바로 계산합니다.

05

강수량 지도

지역 격자의 누적 강수량으로 특정 사각 구역의 총량을 빠르게 구합니다.

어떤 원리로 동작하나요?

prefix[i]를 앞에서 i개 원소의 합으로 정의합니다. 그러면 [left, right]의 합은 prefix[right + 1] - prefix[left]가 됩니다. 앞부분이 서로 상쇄되는 원리입니다.

핵심 연산과 비용

연산Python 표현시간
전처리prefix 만들기O(n)
구간 합prefix[r+1]-prefix[l]O(1)
메모리n+1개 저장O(n)
값 갱신뒤 누적합 수정O(n)
STEP BY STEP

[2, 4, 1, 3]의 1..3 구간

  1. 1
    초기prefix = [0]
  2. 2
    누적prefix = [0, 2, 6, 7, 10]
  3. 3
    공식prefix[4] - prefix[1]
  4. 4
    결과10 - 2 = 8

⚠ 자주 하는 실수

  • 맨 앞에 0을 두면 left가 0인 경우도 같은 공식으로 처리할 수 있습니다.
  • right가 포함되는 구간인지 제외되는 구간인지 문제 정의를 확인합니다.
  • 원본 값이 자주 바뀐다면 누적합보다 Fenwick Tree 같은 구조가 적합합니다.