이번에 풀어본 문제는
백준 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번의 반복으로 누적된 문자열을 출력해주면 해결할 수 있습니다.