[프로그래머스]프린터

GomHyeok·2022년 4월 21일
0

📒활용개념

  1. Queue의 선입선출 개념을 활용하여 프린터 순서 확인
  2. pair를 이용해 원하는 순서가 바뀌더라도 처음의 위치를 기억한다.

📌문제설명

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

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

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

처음 인쇄 순서가 주어지면 그 인쇄 순서를 기준으로 한 위치에서의 문서가 언제 출력되는지를 확인해야한다.

📌구현

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

using namespace std;

int solution(vector<int> priorities, int location) {
    int answer = 0;
    //pair를 활용해서 처음의 위치와 중요도를 기록한다.<중요도, 처음위치>
    queue<pair<int, int> > q;
    //priorities의 index
    int index=0;
    
    for(int i=0; i<priorities.size(); i++){
        q.push({i, priorities[i]});
    }
    
    //중요도가 높은 순서대로 출력할 수 있게 내림차순 정렬
    sort(priorities.rbegin(), priorities.rend());
    
    while(1){
    	//q에서 하나씩 꺼내며 원하는 중요도의 문서인지 확인한다.
        pair<int, int> tmp = q.front();
        q.pop();
        
        if(tmp.second==priorities[index]){
            index++;
            answer++;
            if(tmp.first==location){
                return answer;
            }
        }
        
        else{
            q.push(tmp);
        }
    }
    
    return answer;
}

📌주의점

  • 중요도가 낮은 문서가 나왔을 때 어떻게 그 문서를 다시 뒤로 옮기고 뒤의 문서들을 앞으로 옮길 것이가를 생각해야 한다.
  • 문서의 처음 위치가 어디어었는지 계속 기억해야한다.
profile
github : https://github.com/GomHyeok/

0개의 댓글

관련 채용 정보