슬라이딩 윈도우란?
슬라이딩 윈도우(sliding window) 는 배열 위에서 연속한 구간(창, window) 을
한 칸씩 밀면서, 창 안의 정보(합·개수·최댓값 등)를 처음부터 다시 계산하지 않고
갱신만 하여 \(O(N)\)에 처리하는 기법입니다.
투 포인터의 한 형태로, 특히 "연속 구간"을 다룰 때 강력합니다.
1. 핵심 아이디어: 다시 세지 않는다
길이 \(K\) 창의 합을 매번 처음부터 더하면 \(O(NK)\)입니다. 슬라이딩 윈도우는 창이
한 칸 이동할 때 새로 들어온 원소를 더하고, 빠져나간 원소를 빼는 갱신만 하면
되므로 한 번 이동이 \(O(1)\), 전체 \(O(N)\)입니다.
창이 [a b c] → [b c d]로 이동:
새 합 = 옛 합 - a + d (단 두 번의 연산!)
이 "증분 갱신"이 슬라이딩 윈도우의 전부입니다.
2. 두 종류: 고정 길이 vs 가변 길이
- 고정 길이 창: 창 크기 \(K\)가 정해짐. "길이 \(K\) 구간의 최대 합" 등.
창을 한 칸씩 밀며 들어온 것 더하고 나간 것 뺀다. - 가변 길이 창: 조건을 만족하는 한 창을 늘리고, 어기면 줄인다. "합이 \(S\)
이하인 가장 긴 구간" 등. 투 포인터의 같은 방향 유형과 동일합니다.
3. 고정 길이 예: 창의 합
length-K 창을 오른쪽으로 밀며:
들어온 원소 a[r] 더하기
r >= K 이면 빠진 원소 a[r-K] 빼기
r >= K-1 이면 현재 창의 합을 기록
매 칸 상수 시간 갱신으로 모든 창의 합을 \(O(N)\)에 얻습니다.
4. 가변 길이 예: 조건 만족 최장 구간
"서로 다른 문자가 \(K\)개 이하인 가장 긴 부분 문자열" 같은 문제입니다.
오른쪽 끝 r을 늘려 창을 확장하며 창 안 정보를 갱신.
조건을 어기면 왼쪽 끝 l을 늘려 다시 만족시킨다.
유효할 때마다 길이(r - l + 1)를 최댓값과 비교.
두 포인터가 앞으로만 가므로 \(O(N)\)입니다.
5. 창 안의 정보를 무엇으로 유지하나
창이 유지하는 정보에 따라 보조 자료구조가 달라집니다.
| 유지할 정보 | 도구 |
|---|---|
| 합 | 변수 하나 |
| 원소 빈도/개수 | 맵 또는 카운트 배열 |
| 최댓값/최솟값 | 모노톤 덱 (덱 강의 참고) |
| 서로 다른 값의 수 | 맵 + 카운터 |
특히 창의 최댓값을 \(O(N)\)에 유지하는 모노톤 덱이 자주 결합됩니다.
정리
슬라이딩 윈도우는 연속 구간을 한 칸씩 밀며 정보를 증분 갱신해 \(O(N)\)에 처리하는
기법입니다. 고정 길이(합)와 가변 길이(조건 만족 구간) 두 패턴을 익히고, 창 안
정보에 맞는 보조 도구를 고르면 됩니다. 다음 강의에서 코드로 완성합니다.