728x90
반응형
풀기 전 생각해보기😮
- 정렬을 사용할 수 없음 : 최대범위 값이 너무 크다
- 슬라이딩 윈도우, 덱 자료구조를 이용해서 O(n) 시간복잡도로 풀기
풀이🛫
from collections import deque
N, L = map(int, input().split())
arr = list(map(int, input().split()))
myDeque = deque()
# ([인덱스][값]) 형태로 myDeque에 데이터 관리
for i in range(N):
# 새로운 값이 기존의 값보다 클 때까지 기존의 값 (끝에서부터) 제거
while myDeque and myDeque[-1][0] > arr[i]:
myDeque.pop()
myDeque.append((arr[i], i)) # 새로운 값 입력
# 슬라이딩 윈도우가 인덱스 범위에서 벗어난 경우 제거
if myDeque[0][1] <= i-L:
myDeque.popleft()
print(myDeque[0][0], end=' ')
✅ 문제 분석
- 윈도우의 크기는 최솟값을 구하는 범위가 i-L+1 ~ i까지이므로 L로 생각
- N, L의 최대범위가 5,000,000이므로 정렬을 사용할 수 없음
⇒ O(N) 시간복잡도로 해결 : 슬라이딩 윈도우를 덱 구조를 사용해서 사용
※ 덱을 사용해서 정렬 효과를 보는 방법 풀이 😃 (p.73 참고)
- 인덱스와 값을 저장
- 새로운 값이 들어올 때, 뒤에서부터 값을 비교
- 값이 기존에 있던 값보다 클 경우, 그대로 추가
- 값이 기존에 있던 값보다 작을 경우
- 새로운 값이 기존의 값보다 클 때까지 기존의 값 제거
- 최소값은 윈도우 범위 내에서 찾아야 하는 조건을 적용했을 때, 덱 구조에서 가장 앞에 있는 값이 최소 값이 된다
링크💎
https://www.acmicpc.net/problem/11003
'Algorithm Study > Python' 카테고리의 다른 글
[백준 파이썬] #11725. 트리의 부모 찾기 (0) | 2022.12.28 |
---|---|
[백준 파이썬] #1967. 트리의 지름 (0) | 2022.12.27 |
[백준 파이썬] #2644. 촌수계산 (0) | 2022.12.26 |
[백준 파이썬] #2206. 벽 부수고 이동하기 (1) | 2022.12.20 |
[백준 파이썬] #2638. 치즈 (0) | 2022.12.19 |