CS/자료구조, 알고리즘

구간 합 (Interval Sum)

테크리빗 2025. 12. 23. 02:59
반응형

구간합이란

배열의 처음부터 특정 인덱스까지의 합(누적 합)을 미리 구해놓은 별도의 배열(합 배열)을 이용하여,

특정 구간의 합의 시간복잡도를 O(N)에서 O(1)으로 줄일 수 있습니다.

 

 

핵심 공식

1차원 합배열 공식

기존 리스트 A가 있을 때 합 배열 S는 아래와 같은 구조입니다.

S [i] = A [0] + A [1] +... + A [i]

 

위와 같은 합배열을 좀 더 추상화시키면 아래와 같습니다.

S [i] = S [i-1] + A [i] 

 

1차원 구간합 공식

그렇다면 합배열을 이용해 구간합을 구하는 공식은 어떻게 될까요?

A [2]부터 A [5]까지의 구간합을 구한다고 하면

A [0] ~ A[5] 부터 A[0] ~ A [1]의 차이를 구하는 것과 같습니다.

이는 S [5] - S [1]로 표현할 수 있습니다.

 

이를 추상화해서

i번째부터 j번째까지의 합을 구한다고 한다면 아래와 같습니다.

S(i, j) = S [j] - S [i-1]

출처: https://velog.io/@alkwen0996/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-2%EC%B0%A8%EC%9B%90-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-of-Matrix

 

2차원 합배열

2차원 합 배열 공식은 수식으로만 보면 복잡하지만, '넓이 구하기(면적)' 관점에서 보면 매우 직관적입니다.

핵심은 "이미 구해놓은 넓이를 재활용하자"는 것입니다.

 

A [0,0] ~ A [4,2]를 의미하는 S [4,2]인 녹색영역의 직사각형 넓이(합배열)를 구하려면 어떻게 해야 할까요?

이걸 매번 처음부터 다 더하는 게 아니라, A [4,2]를 기준으로 내 바로 위쪽내 바로 왼쪽에 있는 이미 계산된 직사각형들을 합쳐서 만듭니다.

출처: https://velog.io/@alkwen0996/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-2%EC%B0%A8%EC%9B%90-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-of-Matrix

 

위쪽 직사각형인 S [3,2]와 왼쪽 직사각형인 S [4,1]를 더해주고, 중복되는 영역인 S [3,1]를 빼준다음 A [4,2]만 더하면 됩니다. 

이를 식으로 나타내면 아래와 같습니다.

S [4,2] = S [3,2] + S [4,1] - S [3,1] + A [4,2]

 

이를 추상화하면 아래와 같습니다.

S [i][j] = S [i-1][j] + S [i][j-1] - S [i-1][j-1] + A [i][j]가 됩니다.

 

 

2차원 구간합

A [3,3] ~ A [4,4]인 파란색 영역을 구간합으로 구하고 싶으면 어떻게 해야 할까요?

전체 구간합인 S [4,4]에서 주황색 영역인 S [2,4]와 초록색 영역인 S [4,2]를 빼준다음 두 번 빼버린 부분인 S [2,2]를 더 해주면 됩니다.

정리하면 A [3,3] ~ A [4,4] = S [4,4] - S [2,4] - S [4,2] + S [2,2]입니다.

출처: https://velog.io/@alkwen0996/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-2%EC%B0%A8%EC%9B%90-%EB%88%84%EC%A0%81%ED%95%A9Prefix-Sum-of-Matrix

 

반응형

'CS > 자료구조, 알고리즘' 카테고리의 다른 글

슈도코드(Pseudocode)  (0) 2025.12.20