최근 기업 코테를 보며 자주 접했던 슬라이딩 윈도우에 대해 정리를 해보겠다.
(여태 3월 내 기업 코테에서 3번 정도 본 듯...)
슬라이딩 윈도우란?
일정한 크기의 윈도우를 배열이나 리스트 위에서 이동시키며 문제를 해결하는 기법
이 기법은 주로 연속된 부분 배열에서 최대 및 최소값, 특정 조건을 만족하는 구간 등을 찾는데 사용된다.
전체를 매번 계산하지 않고, 이전 값에서 변경된 부분만 계산해 효율을 높인다는 것을 기억하자!
기본 구조
누적합과 함께 쓸 때
arr = [3, 2, 1, 4, 5]
n = len(arr)
# 1. 누적합 배열 만들기
prefix_sum = [0] * (n + 1)
for i in range(n):
prefix_sum[i+1] = prefix_sum[i] + arr[i]
# 2. 구간합 구하기 (예: 길이 k의 연속합 최대값)
k = 3
max_sum = 0
for i in range(n - k + 1):
window_sum = prefix_sum[i + k] - prefix_sum[i]
max_sum = max(max_sum, window_sum)
print(max_sum)
누적합 없이 쓸 때
(이전 값을 삭제하고 현재 값을 추가하여 중복된 계산은 재활용하며 진행)
arr = [1, 2, 3, 4, 5]
k = 3 # 윈도우 크기
window = sum(arr[:k]) # 초기 윈도우
max_sum = window
for i in range(k, len(arr)):
window += arr[i] - arr[i-k] # 윈도우 이동: 새 값 추가, 이전 값 제거
max_sum = max(max_sum, window)
print(max_sum)
시간 복잡도
전체 배열을 한 번만 돌기 때문에 => O(n)
728x90
'Algorithm > 알고리즘 정리' 카테고리의 다른 글
[Algorithm/Python] MST(최소 신장 트리) 알고리즘 + 크루스칼(Kruskal), 프림(Prim) 알고리즘 정리 (0) | 2024.10.25 |
---|---|
[Algorithm/Python] Disjoint Set(서로소 집합)이란? Union-Find 알고리즘 정리 (1) | 2024.10.25 |
[Algorithm/Python] 다익스트라(Dijkstra) 알고리즘 정리 (0) | 2024.10.14 |
[Algorithm/Python] 다이나믹 프로그래밍 알고리즘 정리 (1) | 2024.09.26 |
[Algorithm/Python] DFS(Depth First Search) / BFS(Breadth First Search) 구현 정리(2) (4) | 2024.09.18 |