Programmers 42587

프린터

Posted by Damin on January 16, 2020

프린터

문제 링크

  • 순서대로 있기 때문에 -> queue

  • 중요도를 queue에서 다 체크를 해줄 수 없다 -> priority queue

이 두개를 이용해서 priority queue의 중요도가 queue의 front 값과

똑같다면

  1. 그것이 알고 싶은 문서라면 종료
  2. 아니라면 priority queue와 queue의 있는 것들 둘 다 pop

다르다면 front의 값을 변수에 저장하고 pop 한 뒤에 다시 push (맨 끝으로 옮기는 과정)

Code

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
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <string>
#include <vector>
#include <queue>
#include <math.h>
#include <algorithm>
#include <iostream>

using namespace std;

typedef pair<int,int> p;

int solution(vector<int> pr, int l) {
    priority_queue<int, vector<int>, less<int>> pq;
    queue<p> q;
    int answer = 0;
    for(int i=0; i < pr.size(); i++){
        pq.push(pr[i]);
        p temp = make_pair(i,pr[i]); // location = first, priority = second
        q.push(temp);
    }
    while(q.size()){
        int tempLocation = q.front().first;
        int tempPriority = q.front().second;
        int nowPriority = pq.top();
        if(nowPriority == tempPriority){ // 지금 인쇄를 해야 하는 것이라면
            if(tempLocation == l){ // 그게 알고 싶은 문서라면
                answer++;
                break;
            }
            else{
                answer++;
                pq.pop();
                q.pop();
            }
        }
        else{ // 아니라면 뒤로 뺴기
            p temp = make_pair(tempLocation,tempPriority);
            q.pop();
            q.push(temp);
        }
    }
    
    return answer;
}