ALGORITHM

백준 1966 프린터 큐 (Java)

공부하는_다온 2023. 4. 22. 23:27

1. 문제 링크

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

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

큐에 입력받은 문서의 번호와 중요도를 넣는다.

그리고 중요도는 따로 list에 저장해서 중요도가 가장 높은 문서를 찾기 위해 사용한다.

이 중요도는 Collections.reverseOrder()로 숫자가 큰 순서, 즉 내림차순으로 정렬한다.

큐에서 하나씩 빼면서 중요도가 가장 높은 문서가 아니라면 다시 큐에 넣는다.

중요도가 가장 높은 문서는 빼는데 그게 원하는 문서라면 반복문을 끝낸다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Queue;
import java.io.IOException;

public class Main {
	static class Node{
		int num;
		int star;
		public Node(int num, int star) {
			super();
			this.num = num;
			this.star = star;
		}
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(br.readLine());
		for(int t=0;t<T;t++) {
			String[] split = br.readLine().split(" ");
			int N = Integer.parseInt(split[0]);
			int M = Integer.parseInt(split[1]);
			Queue<Node> queue = new ArrayDeque<>();
			ArrayList<Integer> list = new ArrayList<>();
			split = br.readLine().split(" ");
			for(int i=0;i<N;i++) {
				int temp = Integer.parseInt(split[i]);
				queue.offer(new Node(i, temp));
				list.add(temp);
			}
			
			Collections.sort(list, Collections.reverseOrder());
			int result = 0;
			while(true) {
				Node now = queue.poll();
				if(now.star == list.get(0)) { //제일 중요도가 큰 녀석
					if(now.num == M) { //그게 원하는 문서라면
						result++;
						break;
					}
					else { //아니라면 그 중요도만 지움
						list.remove(0);
						result++;
					}
				}
				else {
					queue.offer(now);
				}
			}
			sb.append(result).append("\n");
		}		
		System.out.println(sb);
	}

}