Question
문제 해설
- 프린터는 먼저 들어온 순서대로 먼저 뽑힘 : 선입선출
- 작업 진행 중, 뽑으려는 문서의 '중요도'(우선순위) 확인
- 현재 문서의 중요도보다 높은 중요도를 가진 문서가 있으면 뒤로 보냄
- 어떤 한 문서가 몇 번째로 인쇄는지?
Solution
풀이 접근 방법
- 프린터 작업 큐 생성 : 문서 번호와 우선순위 저장 = File Class
- 문서 뽑을 때 마다 자신보다 높은 우선순위가 뒤에 있는지 반복문으로 확인하면 시간복잡도 매우 증가
- 우선순위들만 담은 '우선순위큐' 생성
- 중요도가 높은 숫자면 높은 중요도 = 내림차순 우선순위 큐
- 문서를 뽑을 때 우선순위 큐에서 뽑은 우선순위와 같으면 뽑고, 아니면 뒤로 보냄
정답 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static class File {
int num, priority;
public File(int num, int priority) {
this.num = num;
this.priority = priority;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.valueOf(br.readLine());
while (T-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.valueOf(st.nextToken());
int M = Integer.valueOf(st.nextToken());
Queue<File> queue = new LinkedList<File>();
PriorityQueue<Integer> priority = new PriorityQueue<>(Collections.reverseOrder());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
int filePriority = Integer.valueOf(st.nextToken());
queue.add(new File(i, filePriority));
priority.add(filePriority);
}
bw.write(print(queue, priority, M) + "\n");
}
bw.flush();
bw.close();
}
static int print(Queue<File> queue, PriorityQueue<Integer> priority, int targetNum) {
int count = 1;
while (!queue.isEmpty()) {
File printed = queue.poll();
if (priority.peek() != printed.priority) {
queue.add(printed);
continue;
}
if (printed.num == targetNum) {
return count;
}
priority.poll();
count++;
}
return count;
}
}