누적합이란?
수열 A[1], A[2], A[3], ..., A[N]이 있을 때 A[i] + ... + A[j] 의 구간의 누적합을 구하는 문제입니다.
일반적으로 모든 배열을 돌면서 누적합을 구한다면 시간복잡도는 O(n^2) 입니다.
시간복잡도를 O(n)으로 해결하기 위해서는 누적합(Prefix Sum)을 이용하여 문제를 해결할 수 있습니다.
즉 i번째수까지 전부 구한 값을 구하고자 한다면 첫번째 수부터 i번째까지 수까지 누적하여 더해준 값을 이용하면 됩니다.
=> S[i] = A[1] + A[2] + A[3] + A[i-1] + ... + A[i] = S[i-1] + A[i]
다음과 같은 배열이 있을 경우 누적합은 다음과 같습니다.
i | 0 | 1 | 2 | 3 | 4 |
A[i] | 2 | -2 | 2 | -2 | |
S[i] | 0 | 2 | 0 | 2 | 0 |
만약 i = 2 부터 3까지인 구간합을 구하려면 A[2] = -2, A[3] = 2 이므로 이를 더해주면 0 이라는 것을 알 수 있습니다.
이를 구간합을 이용하면 S[3] = 2, S[1] = 2 이고 이를 빼주면 구간합을 구할 수 있습니다.
그 이유는 아래 그림을 참고하시면 됩니다.
S[i] = A[1] + A[2] + A[3] + A[i-1] + ... + A[i] 이고
이는 S[i] = S[i-1] + A[i] 와 같기때문입니다. ( S[i-1] = A[1] + A[2] + A[3] + A[i-1] 이므로)
'개발 > 알고리즘' 카테고리의 다른 글
백준 9370 미확인 도착지 C++ (0) | 2021.05.29 |
---|---|
펜윅 트리란?(Fenwick Tree, Binary Indexed Tree) (0) | 2021.05.28 |
백준 5719 거의최단경로 C++ (0) | 2021.05.27 |
백준 17612 쇼핑몰 C++ (0) | 2021.05.16 |
백준 4375 1 C++ (0) | 2021.05.15 |