Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

mo1lusca의 블로그

[백준] 1966 프린터 큐 - C++ 본문

PS

[백준] 1966 프린터 큐 - C++

mo1lusca 2025. 6. 1. 22:48

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


 

문서 수, 추적할 문서 번호, 문서의 중요도를 입력받고

문서를 중요도순으로 인쇄할 때의 추적하는 문서가 몇 번째로 인쇄되는지 구한다.


부분 코드 설명

queue<pair<int, int>> q; //importance, index
queue<int> importance;
int temp[100] = { 0, };

 

사용할 변수들을 선언한다. q는 입력값을 순서대로 저장할 queue이다.

입력값인 중요도와 입력순서(index)를 저장해야 하기 때문에 pair클래스를 사용해 두 값을 저장하도록 했다.

temp 배열에서는 입력받은 중요도 값들을 저장한 후 내림차순 정렬할 수 있도록 한다.

정렬한 temp를 importance에 저장해 중요도가 높은 값부터 하나씩 꺼낼 수 있도록 한다.

 

int n, m;
cin >> n >> m;
for (int j = 0; j < n; j++) {
    cin >> temp[j];
    q.push({ temp[j], j });
}

 

temp 배열에 중요도를 입력받고 q에 중요도와 해당 인덱스를 넣는다.

 

bool compare(int a, int b) {
	return a > b;
}
sort(temp, temp + n, compare);
for (int j = 0; j < n; j++) {
    importance.push(temp[j]);
}

 

temp를 정렬 후 importance에 저장한다

 

if (q.front().first == importance.front()) {
    if (q.front().second == m) {
        cout << cnt + 1 << "\n";
        break;
    }
    else {
        q.pop();
        importance.pop();
        cnt++;
    }
}
else {
    q.push(q.front());
    q.pop();
}

 

q.front().first는 가장 앞에 있는 문서의 중요도를 나타낸다.

importance.front()는 아직 인쇄되지 않은 문서의 중요도 중 가장 높은 중요도를 나타낸다.

이 값이 같다면 해당 문서는 인쇄되어야 한다.

 

q.front().second는 가장 앞에 있는 문서의 번호이므로, 이 값이 추적하려는 문서의 번호인 m과 일치하면, 앞서 출력된 문서의 수를 저장하는 변수 cnt에 1을 더해 출력한다.(앞서 출력된 문서 수 + 자기 자신)

일치하지 않는다면 문서를 인쇄는 하되 원하는 문서가 아니므로 cnt를 증가시킨다.

 

만약 q.front().first와 importance.front()가 같지 않다면 대기열에 있는 문서 중 해당 문서보다 중요도가 높은 문서가 있다는 뜻이다.

이때에는 해당 문서를 대기열의 맨 뒤로 옮긴다.

 

전체 코드

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
bool compare(int a, int b) {
	return a > b;
}
int main() {
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		queue<pair<int, int>> q; //importance, index
		queue<int> importance;
		int temp[100] = { 0, };
		int n, m;
		cin >> n >> m;
		for (int j = 0; j < n; j++) {
			cin >> temp[j];
			q.push({ temp[j], j });
		}
		sort(temp, temp + n, compare);
		for (int j = 0; j < n; j++) {
			importance.push(temp[j]);
		}
		int cnt = 0;
		while (!q.empty()) {
			if (q.front().first == importance.front()) {
				if (q.front().second == m) {
					cout << cnt + 1 << "\n";
					break;
				}
				else {
					q.pop();
					importance.pop();
					cnt++;
				}
			}
			else {
				q.push(q.front());
				q.pop();
			}
		}
	}
	return 0;
}

 

실버3 인데 이 정도 코드를 쓰는 건

닭 잡는 데에 소 잡는 칼 쓰는 느낌이지만.....


'PS' 카테고리의 다른 글

[백준] 6198 옥상 정원 꾸미기 - C++  (0) 2025.06.02
[백준] 14729 칠무해 - C++  (0) 2025.06.01
[백준] 3986 좋은 단어 - C++  (0) 2025.06.01
[백준] 9012 괄호 - C++  (1) 2025.06.01
[백준] 1181 단어 정렬 - Rust  (0) 2025.05.27