본문 바로가기
알고리즘 문제풀이/백준

[백준 1966] 프린터 큐(JAVA)

by 소보루:-) 2020. 3. 4.

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

 

1966번: 프린터 큐

문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를

www.acmicpc.net

 

큐를 q1(오리지널 큐), q2(임시 큐)로 두 개 만들어서 풀었다.

q1의 맨 앞의 값을 미리 빼놓고, 큐에 들어 있는 나머지 값들과 비교해주면서 q2로 넣어줬다.

중요도가 더 큰 문서가 있으면, 맨 앞에 있던 문서도 q2에 넣어주었다.

그 다음 q2에 있던 값들을 다시 q1으로 넣어주고, 답을 찾을 때까지 반복하는 방식으로 접근했다. 

 

import java.io.*;
import java.util.*;

class Document {
	int index;
	int val;

	public Document(int index, int val) {
		super();
		this.index = index;
		this.val = val;
	}

}

public class Main_bj_1966_프린터큐 {

	public static int N, M;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; tc++) {
			Queue<Document> q1 = new LinkedList<Document>();
			Queue<Document> q2 = new LinkedList<Document>();
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			st = new StringTokenizer(br.readLine(), " ");
			for (int i = 0; i < N; i++) {
				int n=Integer.parseInt(st.nextToken());
				q1.offer(new Document(i,n));
			}
			int ans=0;
			while(true) {
			Document front = q1.poll();
			int index = front.index;
			int val = front.val;
			boolean f=false;
			while(!q1.isEmpty()) {
				Document next = q1.poll();
				q2.offer(next);
				if(f==false && val<next.val) {
					f=true;
				}
			}
			if(f==false){
				ans++;
				if(index==M) {
					System.out.println(ans+" ");
					break;
				}
			}else {
				q2.offer(front);
			}
			while(!q2.isEmpty()) {
				q1.offer(q2.poll());
			}
			}
		}

	}

}

댓글