제로부터시작하는개발세계
차분 배열 본문
차분배열 Difference Array
구간 업데이트를 빠르게 수행하기 위한 기법입니다.
일반적으로는 특정 구간 업데이트는 O(n) 만큼 걸리지만 차분 배열을 사용하면 O(1)에 가능하다.
누적합을 문제를 풀 때 이러한 방법을 쓴 적이 있지만 특정 기법이 있는지는 잘 몰랐어서 정리를 해보려고 한다.
기본 개념
직관적으로 사용할 때는
A = [1, 2, 3, 4, 5]
라는 배열이 존재하고
0번 인덱스 ~ 2번 인덱스까지 2씩 더할려고 하면
A[0] += 2
A[1] += 2
A[2] += 2
이런 방식으로 총 3번에 걸쳐서 수행이 된다.
이러한 방식으로 여러 번 반복을 할 경우 시간 복잡도가 많이 올라가게 된다.
차분배열을 사용해보자
차분배열을 사용하려면 "배열의 크기 + 1" 크기에 해당하는 배열을 하나 만들어준다.
arr = [0, 0, 0, 0, 0, 0]
여기서 똑같이
0번 인덱스 ~ 2번 인덱스까지 2씩 더해보자
그러면
arr[0] += 2 // 시작 인덱스, 0
arr[3] -= 2 // 종료 인덱스 + 1, 2 + 1
이렇게 구간을 저장해준다.
그리고 실제 값을 더해줄 때는
curValue = 0
for i in range(5):
curValue += arr[i]
A[i] += curValue
처음부터 끝까지 인덱스를 돌게 된다면 O(N) 으로 구간 업데이트가 된 실제 배열로 복원을 할 수 있게 된다.
동작과정을 보면 아래와 같이 동작을 하게 된다.
0 번 인덱스 -> arr[0] = 2 이므로 curValue = 2, 2를 더해준다
1번 인덱스 -> arr[1] = 0, curValue = 2, 2를 더해준다
2번 인덱스 -> arr[2] = 0, curValue = 2, 2를 더해준다
3번 인덱스 -> arr[3] = -2, curValue = 2 - 2 , 0 을 더해준다.
4번 인덱스 -> arr[4] = 0, curValue = 0, 0을 더해준다.
한번 업데이트에서 효율적으로 동작한다보다는 업데이트가 여러 번 반복되는 상황에서 효율적으로 계산을 할 수 있게 된다.
'알고리즘' 카테고리의 다른 글
프로그래머스 Level3 부대복귀 Python (0) | 2022.12.01 |
---|---|
프로그래머스 Level4 2019카카오 겨울 인턴십 호텔 방 배정 Python (0) | 2022.11.29 |
프로그래머스 Level1 명예의 전당 Python (1) | 2022.11.26 |
프로그래머스 Level2 귤 고르기 Python (0) | 2022.11.24 |
프로그래머스 Level2 롤케이크 자르기 Python (0) | 2022.11.24 |