데이터 구조를 이용해서 고정된 크기의 윈도우를 일정 간격으로 이동시키면서 데이터를 처리하는 기법이다.
배열, 문자열, 리스트 등 다양한 자료형에 적용할 수 있고, 주로 연속된 데이터의 부분 집합을 찾거나 부분 집합을 이용한 최소 혹은 최대 값을 찾을 때 사용된다.
파이썬에서는 리스트나 문자열 등의 자료형에서 Slicing을 이용해 슬라이딩 윈도우를 구현할 수 있다.
lst = [1,2,3,4,5]
window = lst[start:end]
Python
복사
위 슬라이싱을 이용해서 연속된 부분 집합의 합, 최소 혹은 최댓값 등을 구하는 문제를 해결할 수 있다.
예를 들어 크기가 k인 슬라이딩 윈도우를 이용해 리스트 lst의 연속된 부분 집합 중 최솟값을 찾는 문제를 해결해보자.
lst = [3,2,5,8,1,4] # 입력 리스트
k = 3 # 슬라이딩 윈도우 크기
min_subarray = [] # 최솟값을 저장할 array
for i in range(len(lst)-k+1): # range(4)
subarray = lst[i:i+k]
min_val = min(subarray)
min_subarray.append(min_val)
print(min_subarray) # [2,2,1,1]
Python
복사
Counter
데이터 개수를 셀 때 매우 유용한 파이썬의 collections 모듈의 Counter 클래스다.
from collections import Counter
Python
복사
•
중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇번 씩 나오는지 저장된 객체를 반환한다.
>>> Counter(['red','blue','red','green','blue','blue'])
Counter({'blue': 3, 'red': 2, 'green': 1})
Python
복사
•
문자열을 인자로 넘기면 각 문자가 문자열에서 몇번 씩 나오는지 알려주는 객체를 반환한다.
>>> Counter('hello world')
Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
Python
복사
Counter 이용하기
•
대괄호를 이용해서 키로 값을 읽을 수 있다 (like 딕셔너리)
counter = Counter('hello world')
>>> counter['o'], counter['l']
(2, 3)
Python
복사
•
특정 키에 해당하는 값을 변경 가능
counter['l'] += 100
counter['h'] -= 1
>>> counter
Counter({'h': 0, 'e': 1, 'l': 103, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
Python
복사
•
in 키워드를 이용해서 특정 키가 존재하는지 확인할 수 있다.
>>> o in counter
True
>>> o not in counter
False
Python
복사
•
most_common()
데이터의 빈도를 내림차순으로 정렬하여 반환하는 메서드
>>> Counter('hello world').most_common()
[('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
# 인자로 k를 입력해주면 그 개수만큼 반환
>>> Counter('hello world').most_common(2)
[('l', 3), ('o', 2)]
Python
복사