본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 프린터 / C++

by msm1029 2022. 3. 9.
반응형

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

 

문제 풀이

먼저, 우선순위 큐에 값들을 넣으면 앞에서부터 우선순위대로 정렬되어 값들이 들어갈 것이다.

    priority_queue<int> pq;
    
    for(int i=0; i<priorities.size(); i++){
        pq.push(priorities[i]);
    }

 

값들을 모두 넣었으면 priorities 배열을 인덱스 0부터 순회한다.

 

location은 내가 프린트 요청한 문서의 인덱스이다. 따라서, 인덱스가 location과 같아진다면 해당 값이

몇 번째로 출력되는지 return하면 된다. 하지만 인덱스가 location이어도 우선순위가 높지 못하면 출력될 수 없다.

즉, pq의 맨 앞(top)에 위치해야 출력될 수 있다.

 

만약, 인덱스가 location과 같지만 우선순위가 높지 못하여 출력되지 못한다면 맨 뒤로 보내준다.

이렇게 반복하다보면 우선순위가 높은 것들은 모두 프린트, 즉 pop이 된다.

또한 프린트되면서 출력 순서가 늘어난 것이므로 answer도 증가시켜준다.

 

이렇게 우선순위대로 출력되면 결국 뒤로 보내놨던 location이 인덱스와 같아지고 결국 return이 있는

종료 조건에 만족하게 된다.

int i = 0;
while(true) {
        if(i == location) {
            if(pq.top() == priorities[i]) return answer;
            else location = priorities.size();
        }
        
        if(pq.top() == priorities[i]) {
            pq.pop();
            answer++;
        }
        else {
            priorities.push_back(priorities[i]);
        }
        
        i++;
    }

 

 

코드

#include <bits/stdc++.h>
using namespace std;

int solution(vector<int> priorities, int location) {
    int answer = 1;
    priority_queue<int> pq;
    
    for(int i=0; i<priorities.size(); i++){
        pq.push(priorities[i]);
    }
    
    int i = 0;
    while(true) {
        if(i == location) {
            if(pq.top() == priorities[i]) return answer;
            else location = priorities.size();
        }
        
        if(pq.top() == priorities[i]) {
            pq.pop();
            answer++;
        }
        else {
            priorities.push_back(priorities[i]);
        }
        
        i++;
    }
}
반응형