구간 합
은 배열이나 리스트와 같은 데이터 구조에서 특정 구간에 있는 요소들의 합을 의미합니다. 이 개념은 다양한 알고리즘과 데이터 처리 문제에서 매우 중요합니다. N = 1,000,000
이고,M = 1,000,000
인 상황처럼 데이터의 개수가 매우 많을 때, 의 시간 복잡도로 동작하는 알고리즘은 문제를 해결할 수 없을 것 입니다.처리
를 수행한 뒤에 나중에 M개의 쿼리를 각각 주어질 때마다 빠르게 도출할수있습니다. Perfix sum(누적합)
알고리즘 입니다. [1,2,3,4]
라면, 누적 합 배열은 [1, 3, 6, 10]
이 됩니다. // Perfix Sum 1차원 구하기
func cumulativeSum(_ arr: [Int]) -> [Int] {
var cumSum = arr
for i in 1..<arr.count {
cumSum[i] += cumSum[i - 1]
}
return cumSum
}
// Perfix Sum 1차원 구하기
func cumulativeSum2(_ arr: [Int]) -> [Int] {
var cumSum = Array(repeating: 0, count: arr.count + 1)
for i in 0..<arr.count {
cumSum[i + 1] = cumSum[i] + arr[i]
}
return cumSum
}
let arr = [1,2,3,4,5]
print(cumulativeSum(arr))
// [1, 3, 6, 10, 15]
위쪽 셀의 누적 합 + 왼쪽 셀의 누적 합 - 대각선 위 셀의 누적합 + 현재 셀의 값
으로 계산할 수 있습니다. func cumulativeSum2D(_ arr: [[Int]]) -> [[Int]] {
let rows = arr.count
let cols = arr[0].count
var cumSum = Array(repeating: Array(repeating: 0, count: cols + 1), count: rows + 1)
for r in 1...rows {
for c in 1...cols {
cumSum[r][c] = cumSum[r - 1][c] + cumSum[r][c - 1] - cumSum[r - 1][c - 1] + arr[r - 1][c - 1]
}
}
return cumSum
}
let arr3 = [
[0, 1, 2],
[5, 6, 7],
[10, 11, 12]
]
print(cumulativeSum2D(arr3))
[[0, 0, 0, 0], [0, 0, 1, 3], [0, 5, 12, 21], [0, 15, 33, 54]]
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.