본문 바로가기
알고리즘

단조 큐

by hwan-da 2024. 9. 9.

https://www.acmicpc.net/problem/11003

 

단조 큐란?

큐에 들어있는 어떠한 값들의 집합이 단조성을 보이는 것

 

위의 백준 문제는 수열을 순회하면서 특정 구간에 대해 최솟값을 찾는 문제

어떤 구간에서 최솟값보다 큰 수들이 무시된다는 점에서 수열을 순회하면서 상대적으로 큰 수들을 배제하면,

구간에 알맞은 최솟값을 남길 수 있을 것이다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

    static class Node {
        int idx;
        int num;

        public Node() {}
        public Node(int idx, int num) {
            this.idx = idx;
            this.num = num;
        }
    }


    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int L = Integer.parseInt(st.nextToken());

        Node[] arr = new Node[N+1];
        st = new StringTokenizer(br.readLine());
        for(int i = 1; i <= N; i++) {
            arr[i] = new Node(i, Integer.parseInt(st.nextToken()));
        }

        sb.append(arr[1].num).append(" ");
        Deque<Node> deque = new ArrayDeque<>();
        int start;
        for(int i = 1; i <= N; i++) {
            start = (i - L + 1) > 0 ? (i - L + 1) : 1;

            if(deque.isEmpty()) {
                deque.addFirst(arr[i]);
                continue;
            }

            while(!deque.isEmpty() && deque.peekLast().num >= arr[i].num) {
                deque.pollLast();
            }

            deque.addLast(arr[i]);

            while(deque.peekFirst().idx < start) {
                deque.pollFirst();
            }

            sb.append(deque.peekFirst().num).append(" ");
        }

        System.out.println(sb);
    }
}

'알고리즘' 카테고리의 다른 글

[백준] 암호만들기  (0) 2025.01.05