알고리즘/백준 BAEK JOON
1966.프린터 큐
IMyoungho
2020. 4. 7. 20:39
이번 문제는 Queue를 이용한 프린터 큐 문제이다!
1966번: 프린터 큐
문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를
www.acmicpc.net
제출하면서 제발 한 번에 좀 맞아라 했는데 (솔직히 속으론 항상 그랬듯 "틀렸습니다"가 나올 줄 알았다..)

너무 기분 좋게 첫 제출로 한 번에 정답을 맞혔다ㅎㅎ 기념으로 스크린샷!!
< Code 설명 >
#include <iostream>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int num;
cin >> num;
int n, m;
int v;
for(int i=0; i<num; i++){
int ans=1;
queue<int> q; // 우선순위가 저장될 queue
queue<bool> c; // 내가 찾는 문서의 위치 저장 queue
// q와 c는 같이 움직인다.
vector<int> mx; // 우선순위의 최대값이 저장
cin >> n >> m; // 문서와 문서의 위치 입력받기
int max=0; // 최대값
for(int j=0; j<n; j++){
cin >> v; // 우선순위 값들 입력받아서
q.push(v); // queue에 저장한다.
mx.push_back(v); // 우선순위들을 mx vector에도 저장해주자
if(max<v) // 이 값들 중 가장 큰 값을 max로 진행
max=v;
if(j==m) // 우리가 찾는 문서의 위치를 true로 표시
c.push(true);
else // 나머지는 false
c.push(false);
}
sort(mx.begin(), mx.end(), greater<int>()); //최대값 내림차순 정렬
int s=1; // 최대값 index 변수
while(true){ // 계속돈다~ 우리가 원하는 값 출력할 때 까지
if(q.front()!=max){ // max가 아니면 true든 false든 상관없음
q.push(q.front()); // q와 c는 한몸이다. 같이 제일 뒤로 옮긴다.
c.push(c.front());
q.pop();
c.pop();
}
else if(q.front()==max){ // q의 제일 앞이 최대 값이면
if(c.front()==true){ // 우리가 찾던 값일 경우에는
cout << ans << endl; // 출력
break;
}
else{ // 아니라면 우리가 찾은 값의 우선순위가 아직 안왔으니
ans++; // 출력 순서를 하나 count해주고
q.push(q.front()); // 출력한 것은 제일 뒤로 돌린다.
c.push(c.front()); // 역시나 한 몸이므로 제일 뒤로..
q.pop();
c.pop();
max=mx[s]; // 최대값은 내림차순 중 그 다음 최대값으로
s++; // 최대값 max에 저장했으니 최대값 index 증가!
}
}
}
}
return 0;
}
반드시 알아야할 TIP!!
# 처음으로 한 번에 생각해서 풀었던 거 같다. 문제이해와 구상하는데 한 20분정도 사용한 문제였다.
# 한 번에 풀었지만 sort 와 queue, vector 사용법을 잊지말자.
반응형