Computer_Language/Algorithm

[백준] 11003번 최솟값 찾기 Python 해설

Joo-Topia 2019. 11. 18. 22:34

출처 : 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

슬라이딩 윈도우 알고리즘으로 분류된 문제이다.

열몇 번의 시도만에 풀었다..

 

풀이


- Python 정답 코드

from collections import deque

n, l = map(int, input().split())
arr = [*map(int, input().split())]
m = deque()
for i in range(n):
    tmp = arr[i]

    while m and m[-1] > tmp: m.pop()
    m.append(tmp)

    #윈도우 크기보다 커진 단계에서 arr와 비교한 후 left pop
    if i >= l and m[0] == arr[i - l]: m.popleft()
    print(m[0], end=' ')

입력으로 주어지는 모든 값을 배열에 넣어준 뒤 슬라이딩 윈도우 알고리즘을 수행한다.

이상하게 다른 언어로는 맞았던 알고리즘도 안 되서 고생을 많이 했다.

popleft와 pop을 사용하여 시간 복잡도를 줄이고, min함수를 사용하지 않고 필요한 만큼의 비교만 수행하여 시간 복잡도를 최대한 줄인 풀이 방법이다.

 

결과 인증


 

부끄럽지만.. 꼭 풀고 싶어서 더 욕심냈던 문제이다..