프로그래머스 - 프린터

Seungjae·2021년 6월 29일
0

알고리즘 문제풀이

목록 보기
27/27

프로그래머스 - 프린터


해당 문제는 아래의 3가지 조건을 만족하는 프린터에서 요청한 문서가 몇 번째로 인쇄되는지 구하는 문제이다.

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼낸다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣는다.
  3. 그렇지 않으면 J를 인쇄한다.

먼저 해당 문제를 풀기위해서는 조건의 흐름대로 구현을 해줄 필요가 있다. 앞에 것을 꺼내고 더 중요도가 높은 문서가 있는지 확인하고 있으면 가장 뒤로 보내고 없으면 인쇄하는 흐름을 구현해야한다. 나는 priority_queue와 queue를 동시에 사용하였다. 우선 priority_queue를 사용하여 현재 인쇄해야할 문서에서 가장 높은 우선순위를 얻었다. 그리고 자신의 기존 인쇄 순서와 우선순위가 저장된 pair를 다루는 queue를 사용하여 문서들을 살피고 뒤로 넣거나 인쇄하는 작업을 진행하였다. 현재가 몇 번째로 인쇄되는지를 구하기 위해서 order 변수도 사용하였다.

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(vector<int> priorities, int location) {
    int answer = 0;
    priority_queue<int> pq;
    queue<pair<int, int>> q;
    for (auto el : priorities) 
        pq.push(el);
    for (int i = 0; i < priorities.size(); i++) {
        q.push(make_pair(i, priorities[i]));
    }

    int order = 0;

    while (q.size()) {
        auto pqT = pq.top();
        auto qF = q.front();
        q.pop();
        if (pqT == qF.second) {
            order++;
            if (qF.first == location) {
                answer = order;
                break;
            }
            pq.pop();
            continue;
        }
        q.push(qF);
    }
    return answer;
}

int main() {
    vector<int> priorities;
    priorities.push_back(1);
    priorities.push_back(1);
    priorities.push_back(9);
    priorities.push_back(1);
    priorities.push_back(1);
    priorities.push_back(1);
    int ans = solution(priorities, 0);
    printf("%d", ans);
    return 0;
}
profile
코드 품질의 중요성을 아는 개발자 👋🏻

0개의 댓글