티스토리 뷰

반응형

* Python을 기준으로 합니다


슬라이딩 윈도우 (Sliding Window)

- 개념

  • 슬라이딩 윈도우 : 고정 크기의 윈도우가 이동하면서 윈도우 내의 데이터를 이용해 문제를 해결하는 방법
    • 투 포인터와 비슷하지만 슬라이딩 윈도우는 정렬 여부에 관계없이 사용 가능
      - 구간 합 계산에 주로 활용
    • Time complexity 측면에서 슬라이딩 윈도우는, 투 포인터와 마찬가지로 $O(n^{2})$ 이상 소모되는 배열 탐색을 $O(n)$ 내에 해결 가능함

슬라이딩 윈도우 vs 투 포인터

- 구현

1. 슬라이딩 윈도우 움직이기

  • 배열에서 고정 크기만큼의 데이터를 가져오기 위해서 slicing을 활용함
def sliding_window(arr, window_size):
  slide = []
  for i in range(len(arr)-window_size+1):
    slide.append(arr[i:i+window_size]) #slicing 활용

  return slide

test = [1,9,3,2,4,5,7,8,6]
slide = sliding_window(test, 3) #3칸의 고정 size로 이동

for sl in slide:
  print(sl, end=' -> ')
print('end')
#[1, 9, 3] -> [9, 3, 2] -> [3, 2, 4] -> [2, 4, 5] -> [4, 5, 7] -> [5, 7, 8] -> [7, 8, 6] -> end

2. 슬라이딩 윈도우를 활용한 구간 합 계산

  • 구간 합 계산은 prefix sum 기법을 활용하여 빠르게 계산할 수 있음
    1. 주어진 각 수들에 대해 prefix sum을 계산하여 새로운 배열 $P$로 저장
    2. 이때 해당 배열에 대한 구간 합은:
      - 1차원 배열일 때 $X$에서 $Y$ 까지의 합:
      $S = P[Y]-P[X-1]$
      - 2차원 배열일 때 $(X1, Y1)$에서 $(X2, Y2)$ 구간에 대한 합:
      $S = P[X2][Y2] - P[X1-1][Y2] - P[X2][Y1-1] + P[X1-1][Y1-1]$
def prefix_sum(arr, left, right):
  pre_sum = 0
  p = [0]

  for i in arr:
    pre_sum += i
    p.append(pre_sum)
  
  return p[right] - p[left-1]

test = [1,9,3,2,4,5,7,8,6]
print(prefix_sum(test, 3, 5)) #3~5번째 수들의 합 (3+2+4 = 9)

구간 합 계산

 

반응형

'Algorithm > Basic' 카테고리의 다른 글

[Algorithm] 완전 탐색  (0) 2024.04.05
[Algorithm] 정렬  (0) 2024.04.04
[Algorithm] 투 포인터  (0) 2024.04.01
[Algorithm] 유니온 파인드, 서로소 집합  (0) 2024.03.31
[Algorithm] 우선순위 큐  (0) 2024.03.30
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday