article thumbnail image
Published 2021. 10. 29. 21:22

문제 설명

문제 링크

http://icpc.me/11003

 

11003번: 최솟값 찾기

N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.

www.acmicpc.net

풀이

덱을 이용하여 풀 수 있다.

덱에 들어있는 값을 단조적으로 유지하면서 k번째 값이 들어올 때 그 k번째 값이 덱에서 가장 큰 값을 유지하게 덱을 관리하면 된다.

또한 덱에는 k - l - 1 이후에 들어온 값만 있어야 한다.

덱을 위와 같이 관리하면 덱의 제일 앞에 있는 값이 최솟값이 되게 된다.

cf) 세그먼트 트리를 이용하면 O(nlogn)에 풀 수 있을 것 같지만 상수 때문인지 시간 초과가 난다. 덱을 이용한 풀이가 정해여서 시간제한을 세그 트리로 뚫지 못하게 만든 거 같다.

코드

#include <cstdio>
#include <deque>

using namespace std;

int main() {
    int n, l; scanf("%d %d", &n, &l);
    deque<pair<int, int>> dq;
    for (int i = 0; i < n; i++) {
        int inp; scanf("%d", &inp);
        while (!dq.empty() && dq.front().second <= i - l) dq.pop_front();
        while (!dq.empty() && dq.back().first > inp) dq.pop_back();
        dq.push_back({inp, i});
        printf("%d ", dq.front().first);
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[5052] 전화번호 목록  (0) 2021.11.04
백준[1913] 달팽이  (0) 2021.11.02
백준[5430] AC  (0) 2021.10.29
백준[16234] 인구 이동  (0) 2021.10.29
백준[1676] 팩토리얼 0의 개수  (0) 2021.10.28
복사했습니다!