백준

백준 11003 최솟값 찾기 (파이썬)

MC류짱 2022. 12. 3. 21:56

풀이 및 해설(주석)

import sys; from collections import deque; import heapq

def solve():
    # 첫 번째 D는 정해졌으니 인덱스 1부터 시작
    for i in range(1, N):
        val = fir_nums[i]
        # Q의 맨 뒤의 값이 현재 값보다 크다면 계속 pop
        while Q and Q[-1] > val:
            Q.pop()
        # 나보다 큰놈 다 뺏으면 내가 들어감 (내가 제일 작은놈임)
        Q.append(val)

        # 이 부분이 좀 힘들었는데 L이 3이고 arr가 [1, 2, 2, 3..] 이고 3번째 인덱스 즉 3일 때
        # Q는 [1, 2, 2, 3]이 된다. 이때 제일 작은놈(0번째 인덱스)가 1인데 이놈을 i-L번째 인덱스와 비교해서 같으면 빼줘야됨
        # 빼줘야 한다는 것은 지금까지 pop이 안되었다는 상황임
        if i >= L and Q[0] == fir_nums[i-L]:
            Q.popleft()
        rst.append(Q[0])
    return rst

if __name__ == "__main__":
    N, L = map(int, sys.stdin.readline().strip().split())
    fir_nums = list(map(int, sys.stdin.readline().strip().split()))
    Q = deque()

    # L이 뭐가 나오든 일단 첫 번째 요소는 Q에 들어가야됨
    Q.append(fir_nums[0])
    # 위와 동일
    rst = [fir_nums[0]]

    print(*solve())