본문 바로가기
코딩 테스트/코딩테스트 - 학습

[DP] 누적합 알고리즘

by 안스 인민군 2023. 1. 31.

누적합 알고리즘은 배열의 일부 구간에 대한 합을 매우 빠르게 구할 수 있는 알고리즘이다.

N개의 원소로 이루어진 배열이 주어졌을 때, 반복문을 통해 부분 배열의 합을 구하려면 O(N)이 걸리는데, 부분 합을 이용하면 모든  부분합을 O(1)에 바로 구할 수 있다.

 

KeyPoint

  • sum은 배열의 +1이다.

 

1차원 배열

- 직관적으로 매우 쉽게 이해가 가능하다. arr 을 순차 탐색하면서 sum배열을 만들어주면 된다.

sum[i]에는 arr[0] + arr[i] + ...+ㅁㄱㄱ[i-1]의 정보가 담겨 있다.

활용법

arr의 i항부터 j항까지의 합을 s(i,j)라고 하자.

이때, s(i,j) = sum[j+1] - sum[i]이다.

2차원 배열

2차원 배열도 같은 방식이다. arr을 순차 탐색하면서 sum 배열을 만들어 주면 된다.

이때 sum[i][j]에는 arr[0][0]부터 arr[i-1][j-1]까지의 합이 담겨 있다고 생각하면 된다.

그림으로 보면 바로 이해 가능

이때 그럼 sum배열은 어떻게 만드는지는 아래와 같이 반복문을 돌려주면 된다.

이때 기억해놓으면 좋은 식은 아래와 같다.

sum_arr[i][j] = arr[i-1][j-1] + sum_arr[i-1][j] + sum_arr[i][j-1] - sum_arr[i-1][j-1]
arr = [[1, 2, 3, 4],
	[2, 3, 4, 5],
    	[3, 4, 5, 6],
    	[4, 5, 6, 7]]
m = 4
n = 3

sum_arr = [[0 for _ in range(m+1)] for _ in range(n+1)]

for i in range(1, n+1):
	for j in range(1, m+1):
		sum_arr[i][j] = arr[i-1][j-1] + sum_arr[i-1][j] + sum_arr[i][j-1]- sum_arr[i-1][j-1]

2차원 구간 합 활용법

이제 이 sum_arr 을 활용하면 2차우너 배열에서도 상수 시간에 구간합을 구할 수 있다.

arr의 (x1,y1)부터 (x2,y2)까지 합을 S라 할때, 아래와 같이 구할 수 있다.

S = sum[x2+1][y2+1] - sum[x1][y2+1] - sum[x2+1][y1] + sum[x1][y1]

'코딩 테스트 > 코딩테스트 - 학습' 카테고리의 다른 글

이분 탐색 & 매개변수 탐색 & 투 포인터 탐색  (0) 2023.02.02
Stack/Queue  (0) 2023.02.01
DP  (0) 2023.01.30
자주 잊는 코딩테스트 문법  (0) 2023.01.29
Union Find 서로소 집합 알고리즘  (0) 2023.01.28