본문 바로가기
Problem-solving/프로그래머스

프로그래머스 - 프린터 (C++)

by taehee.kim.dev 2020. 4. 4.
#include <vector>
#include <utility>
#include <deque>

using namespace std;

/*
    중요도 : 숫자가 클 수록 중요하다.
    location : 내가 인쇄 요청한 문서의 인덱스(0부터 시작)
    return value : 번째의 수로, 1부터 시작
*/

int solution(vector<int> priorities, int location) {

    // 현재까지 인쇄된 문서의 수
    int current_print_count = 0;

    // queue<pair<중요도, 내 문서 여부>>
    deque<pair<int, bool>> documents_deque;

    // 중요도 별 문서의 개수
    vector<int> documents_count_per_priority_vec(10, 0);

    // 매개변수 벡터를 모두 덱에 push_back
    for(int document_index = 0; document_index < priorities.size(); document_index++){
        
        // 만약 내가 인쇄 요청한 문서의 인덱스라면, bool값을 true로
        if(document_index == location){
            documents_deque.push_back(make_pair(priorities[document_index], true));
        }else{
            documents_deque.push_back(make_pair(priorities[document_index], false));
        }

        // 현재 검사하고있는 문서의 중요도에 해당하는 문서의 개수 1 증가.
        documents_count_per_priority_vec[priorities[document_index]]++;

    }

    // 대기열에 있는 문서가 모두 인쇄될 때 까지 반복한다.
    while(documents_deque.size() > 0){

        // 맨 앞 문서를 임시 저장
        pair<int, bool> front_document = documents_deque.front();

        // 일단 맨 앞 문서를 대기열에서 빼낸다.
        documents_deque.pop_front();

        // 맨 앞 문서의 중요도
        int priority_of_front_document = front_document.first;

        // 프린트 가능 여부
        bool print_possible = true;

        // 맨 앞 문서의 중요도보다 큰 중요도를 갖는 문서의 개수가 1 이상인가?
        for(int priority = priority_of_front_document + 1; priority <= 9; priority++){
            // 맨 앞 문서의 중요도보다 큰 중요도를 갖는 문서의 개수가 하나라도 있다면,
            // 프린트 가능 여부를 false로 바꾸고, 바로 break.    
            if(documents_count_per_priority_vec[priority] > 0){
                print_possible = false;
                break;
            }
        }

        // 프린트 가능 여부에 따라
        if(print_possible){
            // 만약 프린트가 가능하다면,
            // 인쇄를 한다.
            // 그리고 현재까지 인쇄된 문서의 수 값을 1 증가시킨다.
            current_print_count++;
            // 그리고 중요도 별 문서의 개수를 저장한 벡터에서,
            // 현재 인쇄한 중요도의 문서의 개수를 1 감소시킨다.
            documents_count_per_priority_vec[priority_of_front_document]--;
            // 내가 인쇄를 요청한 문서라면
            // 현재까지 인쇄된 문서의 수 값을 반환한다. 
            if(front_document.second == true)
                return current_print_count;
        }else{
            // 프린트가 불가능하다면,
            // 맨 앞 문서를 대기열의 맨 뒤에 넣는다.
            documents_deque.push_back(front_document);
        }

    }
}

댓글