알고리즘/백준 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 사용법을 잊지말자.
반응형