Study/Algorithm
BOJ (C/C++) 1966번: 프린터 큐
hwooo
2022. 10. 28. 05:18
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net


풀이
큐에서는 원소의 탐색이 어려워서 큐와 똑같이 동작하는 벡터를 사용하여 최댓값을 찾아냄.코드
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector <int> V;
queue <pair<int, int>> Q;
int Find_max(int N) {
int max = 1, max_i = 0;
for (int i = 0; i < N; i++) {
if (max < V[i]) max = V[i], max_i = i;
}
V[max_i] = 0; // 큐에선 제거된 원소
return max;
}
int main() {
int T, N, M;
int n, idx, max, cnt = 0;
scanf("%d", &T);
for (int t = 0; t < T; t++) {
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) {
scanf("%d", &n);
V.push_back(n);
Q.push({ i,n });
}
while (1) {
max = Find_max(N);
while (1) {
idx = Q.front().first, n = Q.front().second;
if (n == max) break;
// 중요도가 가장 높은 문서가 가장 앞에 올 때까지
Q.push({ idx,n });
Q.pop();
int tmp = V[0]; V[0] = V[N - 1]; V[N - 1] = tmp;
}
cnt++;
if (idx == M) break;
Q.pop();
}
printf("%d\n", cnt);
// 초기화
cnt = 0;
V.clear();
while (!Q.empty()) Q.pop();
}
return 0;
}