백준 1966 프린터 큐 (Java,자바)

jonghyukLee·2022년 12월 8일

이번에 풀어본 문제는
백준 1966번 프린터 큐 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PipedReader;
import java.util.*;

class Print {
    int idx;
    int lev;

    public Print(int idx, int lev) {
        this.idx = idx;
        this.lev = lev;
    }
}
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        while (T-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());

            Queue<Print> q = new LinkedList<>(); // 순서를 담는 큐
            Queue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder()); // 내림차순 (중요도 높은거 먼저)

            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                int tmpValue = Integer.parseInt(st.nextToken());
                q.add(new Print(i, tmpValue));
                pq.add(tmpValue);
            }

            int tmpCount = 1;
            loop : while(!pq.isEmpty()) {
                int next = pq.poll();

                // 다음 중요도 값을 탐색하여 꺼냄
                while (!q.isEmpty()) {
                    if (q.peek().lev != next) {
                        // 다시 뒤로
                        q.add(q.poll());
                    }
                    else {
                        Print print = q.poll();
                        if (print.idx == M) break loop;
                        tmpCount++;
                        continue loop;
                    }
                }
            }
            sb.append(tmpCount).append("\n");
        }
        sb.deleteCharAt(sb.length() - 1);
        System.out.print(sb);
    }
}

📝 풀이

중요도가 높은 인쇄물을 우선적으로 출력한다고 할 때, 입력으로 주어진 인덱스가 몇 번째로 출력되는지를 구하는 문제입니다.
현재 큐 안에서 중요도가 가장 높은 인쇄물을 파악하기 위해 우선순위 큐를 추가적으로 사용했습니다. 우선순위 큐에서 값을 꺼냄으로써 반복이 시작되며, 해당 값과 동일한 값을 현재 큐에서 발견할 때 까지는 계속 큐의 순서를 갱신해줍니다.
현재 가장 중요도가 높은 (큐에서 방금 꺼낸 값)값을 발견했다면 인쇄를 실행하고, 만약 그 인덱스가 입력으로 주어진 M과 같다면 탐색을 종료하며, 그렇지 않다면 카운트를 올려줍니다.
마지막으로, T번의 반복으로 누적된 문자열을 출력해주면 해결할 수 있습니다.

profile
머무르지 않기!

0개의 댓글