본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 1966번 : 프린터 큐

by 희조당 2021. 7. 24.
728x90

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

 

1966번: 프린터 큐

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

www.acmicpc.net


 문제 풀이

이번 문제는 idx와 중요도를 pair로 만들어서 큐에 저장하고,

중요도를 순서대로 정렬한 다른 컨테이너를 만들어서 비교하는게 중요하다.

중요도를 비교해서 맞으면 출력회수(cnt)를 늘리고 만약 m과 idx가 같다면 출력회수를 출력하고 종료한다.

 느낀 점

문제를 해결하고 보니 많은 분들이 우선순위 큐를 이용하셨고 나보다 코드가 더 깔끔했다. 하지만 나는 우선순위 큐에 대해서 몰랐기 때문에 벡터로 구현했다. q.front()와 같은 직접적인 내장 함수로 접근하면 런타임 에러가 발생할 수 있다는 점을 알게되었다! 다음부터 구현할 때 따로 변수를 만들어줘서 다뤄야겠다.

 코드

#include <iostream>
#include <utility>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int t, n, m, input;

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

	cin >> t;
	while (t--) {
		queue<pair<int, int>> q;
		vector<int> v;
		int cnt = 0;

		cin >> n >> m;
		for (int i = 0; i < n;i++) {
			cin >> input;
			q.push({ i, input });
			v.push_back(input);
		}

		sort(v.begin(), v.end());

		while (!q.empty()) {
			int idx = q.front().first;
			int priority = q.front().second;
			q.pop();
			if (v.back() == priority) {
				cnt++;
				v.pop_back();
				if (idx == m) {
					cout << cnt << "\n";
					break;
				}
			}
			else {
				q.push(make_pair(idx, priority));
			}
		}
	}
}

댓글