[백준/BOJ] 백준 1966번 : 프린터 큐

2020. 6. 5. 02:30알고리즘 문제풀이

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

 

1966번: 프린터 큐

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

www.acmicpc.net

문서의 중요도를 저장할 우선순위 큐와 각 문서의 위치와 그에 해당하는 중요도를 저장할 큐를 만들었다.

우선순위 큐의 top부분과 큐의 front부분 중요도가 같은지 비교해, 중요도가 같다면 프린트하고 그렇지 않으면 큐에서 해당 부분을 뒤로 보냈다. 그리고 프린트를 할 때 그 문서가 궁금한 문서이면 그때의 문서가 몇 번째로 인쇄되는지 구하였다.

 

코드

#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int testcase;
	int n; //문서의 수
	int m; //몇번째로 인쇄되었는지 궁금한 문서
	
	cin >> testcase;
	
	for (int t = 0; t < testcase; t++)
	{
		cin >> n;
		cin >> m;

		queue <pair<int, int>> box;//문서위치와, 중요도를 저장
		int temp;
		priority_queue<int> value;//중요도를 내림차순으로 정렬
		for (int i = 0; i < n; i++)
		{
			cin >> temp;
			value.push(temp);
			box.push(make_pair(i, temp));
		}

		int num = 1;

		while (1)
		{
			if (value.top() == box.front().second)
			{
				if (box.front().first == m)//궁금한 문서를 프린트할때
					break;
				else//궁금한 문서가 아닌 다른 문서를 프린트할때
				{
					num++;
					value.pop();
					box.pop();
				}
			}
			else
			{
				//앞에 것을 다시 뒤로 보낸다.
				pair<int,int> temp_pair = box.front();
				box.pop();
				box.push(temp_pair);
			}
		}

		cout << num <<"\n";

	}

	return 0;
}