728x90
반응형
https://www.acmicpc.net/problem/11003
11003번: 최솟값 찾기
N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.
www.acmicpc.net
문제 해결
- i~i+l-1 까지 리스트 원소중 최솟값을 찾는 것이다.
- 다른 수들은 고려할 필요가 없으므로 (value,index)를 deque를 이용해 저장하자.
- 원소를 0~n까지 돌면서 deque[-1][0]과 비교하여 원소가 더 작으면 deque[-1][0]을 빼준다. 이를 반복한다. 필요 없기 때문에... 그리고 deque[-1][0]이 더 커지는 때가 오면 오른쪽에 그 원소를 넣는다.
- 만약 deque[-1][0]이 더 크면 원소를 deque오른쪽 자리에 넣는다. 이는 i~i+l-1까지 원소 중 최솟값을 구하는 것이므로 혹시모를 예비 순번을 생각하면 되는 것이다.
- 원소를 돌면서 바로바로 출력을 할 것이다. i번째 원소를 돌고있으면 i-l+1~i-l번째 원소를 관찰한다고 보면 된다. 이는 코드를 보면 알겠지만 i-l+1이 음수여도 상관이 없다,
- 만약 deque의 맨 왼족 원소가 그 범위안에 들어가지 않으면, 즉 i-l+1보다 작으면 popleft()를 통해 버려준다. 유통기한이 지났다고 생각하면 된다.
- 마지막에 남은 deque의 맨 왼쪽 수를 출력한다. 이때 아직 i번째 돌고 있으므로 end=' '를 통해 출력을 이어나갈 것이다.
CODE
import sys
from collections import deque
input = sys.stdin.readline
n, l = map(int, input().split())
que = deque()
A = list(map(int, input().split()))
for i in range(n):
while que and que[-1][0] > A[i]:
que.pop()
que.append((A[i], i))
if que[0][1] <= i-l:
que.popleft()
print(que[0][0], end=' ')
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 2023 신기한 소수 (0) | 2023.02.22 |
---|---|
[python] 백준 10989 수 정렬하기 3 (0) | 2023.02.22 |
[python] 백준 12891 DNA 비밀번호 (0) | 2023.02.19 |
[python] 백준 1253 좋다 (0) | 2023.02.18 |
[python] 백준 2018 수들의 합 5 (0) | 2023.02.18 |
댓글