슬라이딩 윈도우: 고정 길이 합과 양수 배열의 가변 구간

··설명 약 7분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 구간과 탐색 · 알고리즘 개념

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

슬라이딩 윈도우는 연속 구간의 합을 어떻게 갱신하나요?

슬라이딩 윈도우는 연속된 구간의 상태를 유지하며 양끝을 옮기는 방법입니다. 들어오는 값은 더하고 빠지는 값은 빼면 구간 전체를 다시 계산할 필요가 없습니다.

길이 3 창이 2·1·5에서 1·5·1로 이동하며 합이 8에서 7로 바뀌는 그림
창에서 빠지는 2를 빼고 새로 들어오는 1을 더하면 8−2+1=7입니다. 겹치는 두 값은 다시 더할 필요가 없습니다. 원본 보기 (새 탭)

[2,1,5]의 합은 8입니다. 창을 한 칸 옮긴 [1,5,1]의 합은 8 - 2 + 1 = 7입니다.

적용 조건·범위: 두 합 예제는 입력값과 목표값뿐 아니라 모든 중간 덧셈·뺄셈 결과도 JavaScript Number의 안전한 정수 범위 안이라고 가정합니다. 각 원소가 안전한 정수여도 합이나 차가 범위를 넘으면 정확한 비교를 보장할 수 없습니다.

본문 근거: Competitive Programmer’s Handbook — Antti Laaksonen · ECMAScript 2025 — Number.MAX_SAFE_INTEGER

슬라이딩 윈도우 개념을 표현한 일러스트 표지

이 글에서 할 일: 고정 길이 창을 갱신하고 가변 창에 양수 조건이 필요한 이유를 확인합니다. 선수 지식: 배열·반복문·누적 합.

고정 길이 K의 합을 갱신하기

두 합 예제는 입력값과 목표값뿐 아니라 모든 중간 덧셈·뺄셈 결과도 JavaScript Number의 안전한 정수 범위 안이라고 가정합니다. 각 원소가 안전한 정수여도 합이나 차가 범위를 넘으면 정확한 비교를 보장할 수 없습니다.

길이 3의 세 창 2·1·5, 1·5·1, 5·1·3의 합을 갱신하는 과정
첫 합 8에서 빠지는 값을 빼고 들어오는 값을 더하면 7, 9로 바뀝니다. 최댓값은 실제 첫 구간 합에서 시작해야 음수 입력도 처리할 수 있습니다. 원본 보기 (새 탭)

아래 JavaScript 예제는 길이가 같은 연속 구간의 합을 구하고 가장 큰 값을 찾습니다. 코드 아래의 결과와 표를 보면서 창이 이동할 때 어떤 값을 빼고 더하는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

function maxWindowSum(values, k) {
  // 계약: 입력값과 모든 중간 덧셈·뺄셈 결과는 Number의 안전한 정수
  if (!Number.isInteger(k) || k < 1 || k > values.length) {
    return null;
  }
  let sum = 0;
  for (let i = 0; i < k; i++) sum += values[i];
  let best = sum;
  for (let right = k; right < values.length; right++) {
    sum += values[right] - values[right - k];
    best = Math.max(best, sum);
  }
  return best;
}

console.log(maxWindowSum([2, 1, 5, 1, 3], 3));
console.log(maxWindowSum([-4, -2, -7], 2));

실행 결과

9
-6
길이 3인 모든 연속 구간
구간 계산 합
[2,1,5] 처음 세 값의 합 8
[1,5,1] 8 – 2 + 1 7
[5,1,3] 7 – 1 + 3 9

불변식은 sum이 현재 길이 K 구간의 합이라는 것입니다. 최댓값을 0에서 시작하면 전부 음수인 입력에서 틀리므로 첫 구간의 합으로 시작합니다. K가 1보다 작거나 배열보다 크면 이 함수는 null을 반환합니다.

내 컴퓨터에서 직접 실행하기 — 고정 길이 구간 합 예제 (선택)

코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.

준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.

  1. 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
  2. 그 폴더 안에 fixed-window.js 파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막 console.log 줄도 포함하며, 파일 이름 끝이 .js.txt가 되지 않도록 확인합니다.
  3. VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version

v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.

터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.

node fixed-window.js

터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.

양수 배열에서는 합이 크면 왼쪽을 줄입니다

아래 JavaScript 예제는 양수 배열에서 합이 목표값과 같은 연속 구간의 개수를 셉니다. 코드 아래의 결과와 설명을 보면서 합에 따라 구간의 양끝이 어떻게 움직이는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

양수 배열 1·2·1·1·3에서 합이 3인 세 연속 구간
목표 3을 만드는 구간은 인덱스 [0..1], [1..2], [4..4]입니다. 양수에서는 합이 커질 때 왼쪽 값을 빼며 구간을 줄일 수 있습니다. 원본 보기 (새 탭)
function countPositiveWindows(values, target) {
  // 계약: 모든 원소와 target은 양의 안전한 정수
  // 모든 중간 덧셈·뺄셈 결과도 Number의 안전한 정수 범위
  let left = 0;
  let sum = 0;
  let count = 0;
  for (let right = 0; right < values.length; right++) {
    sum += values[right];
    while (sum > target) sum -= values[left++];
    if (sum === target) count++;
  }
  return count;
}

console.log(countPositiveWindows([1, 2, 1, 1, 3], 3));

실행 결과

3

양수 배열에서 오른쪽 값을 추가하면 합은 커지고, 왼쪽 값을 빼면 작아집니다. 따라서 목표보다 커진 구간은 왼쪽을 줄여도 됩니다. 합이 목표가 되는 시작 위치는 같은 오른쪽 끝에 대해 최대 하나이므로 한 번만 셉니다. 예제의 세 구간은 인덱스 [0..1], [1..2], [4..4]입니다.

여기서 구간은 연속 부분수열입니다. 떨어진 원소를 골라 합을 만드는 부분집합 문제에 이 코드를 적용할 수는 없습니다.

내 컴퓨터에서 직접 실행하기 — 양수 배열의 구간 개수 예제 (선택)

코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.

준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.

  1. 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
  2. 그 폴더 안에 positive-window.js 파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막 console.log 줄도 포함하며, 파일 이름 끝이 .js.txt가 되지 않도록 확인합니다.
  3. VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version

v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.

터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.

node positive-window.js

터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.

0·음수·빈도표에서 달라지는 점

0을 허용하면 같은 오른쪽 끝에 정답 시작 위치가 여러 개 생길 수 있습니다. [0,0,3]에서 목표가 3인 구간은 세 개지만 위 함수는 하나만 셉니다. 음수가 있으면 합의 증가·감소 방향도 보장되지 않습니다. [4,-1]의 목표 3은 앞의 4를 미리 버리면 놓칩니다.

0·0·3에서 같은 끝을 가진 여러 구간과 4·-1에서 양수 창 규칙이 놓치는 합
0이 있으면 같은 오른쪽 끝에서 합 3인 시작점이 여러 개입니다. 음수가 있으면 4를 먼저 버린 뒤 합 3을 놓칠 수 있으므로 양수 가변 창의 규칙을 그대로 쓰지 않습니다. 원본 보기 (새 탭)

고정 길이 합 갱신은 음수가 있어도 성립합니다. 제약이 필요한 것은 여기서 제시한 양수 가변 창의 개수 세기 규칙입니다. 음수를 허용하는 합 문제는 누적 합과 빈도표 등 다른 방법을 검토합니다.

아나그램은 고정 길이 창의 상태를 합 대신 문자별 개수로 둡니다. 새 문자는 +1, 빠지는 문자는 -1로 갱신합니다. 0개인 키를 지울지 유지할지 통일하고, 비교에 사용하는 문자 범위도 같게 정하세요.

두 합 예제는 O(N) 시간과 O(1) 추가 공간입니다. 가변 창의 while이 중첩되어도 left는 전체 실행 동안 N번 이하 움직입니다. 빈도표를 매 창마다 D종 전체 비교하면 O(ND)이며, 문자 종류가 고정되어 있거나 불일치 개수를 따로 유지할 때 O(N)으로 줄일 수 있습니다.

직접 확인하고 문제에 적용하기

[-4,-2,-7]에서 K=2의 최댓값을 0으로 초기화하면 왜 틀릴까요? [0,0,3]의 정답 구간도 직접 적어 보세요.

음수 고정 창의 초기값과 0이 있는 연속 구간을 직접 확인하는 빈 연습 그림
K=2인 음수 배열에서 best를 0으로 시작해도 되는지 생각해 보세요. 0·0·3의 가능한 연속 구간도 직접 기록합니다. 원본 보기 (새 탭)
답과 이유 확인

실제 합은 -6과 -9라 최댓값은 -6입니다. 0은 어떤 구간의 합도 아닙니다. 0을 포함한 예제의 정답은 [0..2], [1..2], [2..2] 세 구간입니다.

참고 자료

자료 확인일: 2026년 10월 19일.

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 포인터를 움직여도 답을 버리지 않는 이유와 양수·0·음수의 차이를 설명하세요.

이 개념으로 더 풀어보기

다음 추천 · 이 개념으로 풀 문제: 코딩테스트 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기

같은 주제의 문제에 적용하며 방금 배운 개념을 확인합니다.

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 30개 · 필수 0개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기