알고리즘Medium#183
슬라이딩 윈도우는 어떤 상황에서 사용하나요?
#알고리즘#SlidingWindow#배열#문자열
답변 포인트
연속 구간의 효율적 갱신를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
슬라이딩 윈도우는 연속 구간을 유지하며 빠지는 값과 들어오는 값만 갱신합니다. 구간 합, 문자열 빈도, 조건 만족 최소 길이 문제에 적합합니다.
슬라이딩 윈도우는 연속된 구간(window)을 유지하면서 시작과 끝을 조금씩 이동해 조건을 만족하는 부분 배열/문자열을 효율적으로 찾는 기법입니다. 매번 구간을 새로 계산하지 않고, 빠지는 값과 들어오는 값만 반영하는 것이 핵심입니다.
핵심 개념
- 고정 길이 윈도우는 길이가 정해진 구간의 합/최댓값/평균을 빠르게 계산할 때 사용합니다.
- 가변 길이 윈도우는 조건을 만족하는 최소/최대 길이 구간을 찾을 때 사용합니다.
- 윈도우 상태를 O(1)에 갱신할 수 있어야 효과가 큽니다.
동작 방식 또는 판단 기준
이 주제를 이해할 때는 다음 순서로 보면 실무 적용이 쉬워집니다.
- 무엇을 해결하려는가: 성능, 표현력, 안정성, 접근성 중 어떤 문제를 줄이려는지 확인합니다.
- 전제 조건은 무엇인가: 정렬 여부, 브라우저 지원, 네트워크 특성, 동시성 조건처럼 성립해야 하는 조건을 점검합니다.
- 비용은 어디서 발생하는가: 시간 복잡도, 메모리, 캐시, 재시도, 렌더링 비용처럼 병목 지점을 나눠 봅니다.
- 실패 시 어떤 문제가 생기는가: 잘못 적용했을 때의 버그나 운영 리스크를 함께 고려합니다.
실제 예시
JavaScript
// 길이 k인 연속 부분 배열의 최대 합
function maxWindowSum(arr, k) {
let sum = 0;
for (let i = 0; i < k; i++) sum += arr[i];
let best = sum;
for (let right = k; right < arr.length; right++) {
sum += arr[right] - arr[right - k];
best = Math.max(best, sum);
}
return best;
}실무에서 주의할 점
- 연속 구간이 아닌 조합 문제에는 슬라이딩 윈도우를 적용할 수 없습니다.
- 가변 윈도우는 조건이 포인터 이동에 대해 단조롭게 변해야 합니다.
- 최댓값/최솟값처럼 빠지는 값이 현재 답인지 알아야 하는 문제는 deque를 함께 써야 할 수 있습니다.
실무 적용 가이드
- 문제에 '연속 부분 배열', 'substring', '길이 k'가 나오면 후보로 봅니다.
- 윈도우에 필요한 상태(sum, count map, max deque)를 명확히 정의합니다.
- left/right 이동 후 상태가 어떤 불변식을 만족해야 하는지 주석으로 남기면 버그를 줄일 수 있습니다.
함께 연결해서 보면 좋은 키워드
Sliding Window, Subarray, Substring, Two Pointers
정리
슬라이딩 윈도우는 연속된 구간(window)을 유지하면서 시작과 끝을 조금씩 이동해 조건을 만족하는 부분 배열/문자열을 효율적으로 찾는 기법입니다. 다만 개념 자체보다 중요한 것은 적용 조건과 한계를 함께 이해하는 것입니다. 작은 예제에서는 단순해 보여도 실제 서비스에서는 성능, 보안, 유지보수성, 접근성 요구사항이 함께 얽히므로, 문제의 성격을 먼저 파악한 뒤 적절한 도구로 선택하는 것이 좋습니다.