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

반응형