노트

슬라이딩 윈도우

Sliding Window

CS#algorithm · 연결된 개념 5개

쉽게 말하면

슬라이딩 윈도우는 기차 창밖 풍경처럼 창을 한 칸씩 밀면서, 새로 들어온 것 하나와 빠져나간 것 하나만 반영하는 방식이에요. 매번 창 안을 처음부터 다시 세지 않으니 O(n)에 끝나요.

비유가 깨지는 곳 기차 창은 크기가 고정이지만, 조건을 만족하는 동안 오른쪽을 늘리고 깨지면 왼쪽을 줄이는 가변 크기 창도 있어요. 최댓값은 0이 아니라 첫 창의 합으로 시작해야 음수에서 틀리지 않아요.

배열이나 문자열의 연속된 구간(창)을 한 칸씩 밀면서, 매번 처음부터 다시 계산하지 않고 빠지는 값과 들어오는 값만 반영하는 패턴. 연속 부분 배열·부분 문자열 문제를 O(n)에 푼다.

// 길이 k인 연속 구간의 최대 합
function maxWindowSum(arr: number[], k: number) {
  if (arr.length < k) return null
  let sum = 0
  for (let i = 0; i < k; i++) sum += arr[i] // 첫 창
  let max = sum
  for (let i = k; i < arr.length; i++) {
    sum += arr[i] - arr[i - k] // 오른쪽 하나 더하고 왼쪽 하나 뺀다
    max = Math.max(max, sum)
  }
  return max
}
  • 최댓값을 0 같은 임의의 값으로 시작하면 음수만 있는 배열에서 틀린다. 첫 창의 합으로 시작한다
  • 고정 크기 창(Fixed-Size Window): 위처럼 길이가 정해진 경우
  • 가변 크기 창(Variable-Size Window): "중복 없는 가장 긴 부분 문자열"처럼 조건을 만족하는 동안 오른쪽을 늘리고, 깨지면 왼쪽을 줄인다. 창 안의 상태는 빈도표나 Set으로 관리한다
  • 창의 양끝을 가리키는 투 포인터의 한 형태다

네트워크의 흐름 제어(Flow Control)나 시간 창 단위의 요청 제한(요청 제한 (Throttling))도 같은 이름의 아이디어를 쓴다. 다른 패턴은 알고리즘 문제 풀이 접근법.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 동적 프로그래밍

    복잡한 문제를 더 작은 부분 문제로 나눠 풀되, 한 번 푼 부분 문제의 답을 저장해 다시 계산하지 않는 방법. 두 조건이 맞을 때 쓴다.

  • 연결 리스트

    각 노드가 값과 다음 노드를 가리키는 포인터를 가지고 사슬처럼 이어진 자료구조. 리스트는 맨 앞(Head)과 맨 뒤(Tail), 길이 정도만 기억한다. 배열과 달리 인덱스가 없다.

  • content-visibility

    화면 밖에 있는 요소의 렌더링을 건너뛰어도 된다고 브라우저에 알려 주는 CSS 속성. auto를 주면 뷰포트에서 멀리 있는 요소의 레이아웃·페인트를 생략하므로, 긴 페이지의 첫 렌더링과 스크롤이 빨라진다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 레퍼런스 카운팅

    공유 자원을 쓰는 사용자 수를 세어, 수가 0에서 1이 될 때 자원을 준비하고 1에서 0이 될 때 정리하는 기법. 사무실에 처음 들어온 사람이 불을 켜고, 마지막에 나가는 사람이 끄는 규칙과 같다.

보기 옵션