GitHubSeob

C++ / 프로그래머스 / 프린터 본문

Programmers/Level 2

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

GitHubSeob 2021. 11. 8.

문제

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

문제풀이

deque와 pair를 이용해서 풀었다.

deque는 priorities와 몇 번째 인덱스인지 값을 넣어준다. deque({priorities, idx})

value라는 벡터를 만들어 오름차순으로 정렬하여 모든 작업의 중요도를 저장하도록 한다.

count는 몇 번째 작업인지, value_f는 deque.front().first의 값을, value_s는 second의 값을 저장한다.

value_cnt는 현재 가장 높은 중요도(*max_element)를 나타내기 위한 변수다.

print가 빌 때까지 while문을 이용해 아래의 작동을 반복한다.

print의 맨 앞이 가장 높은 중요도를 가지고 있는지를 확인한다.

맞다면 location값과 second값을 비교해서 찾는 작업인지를 확인한다. 맞다면 count를 return 한다.

아니라면 front.pop을 하여 해당 작업을 한다.

가장 높은 중요도가 아니라면 맨 앞에 deque의 맨 앞에 있는 값들을 빼서 맨 뒤로 옮긴다(front.pop 하고 push_back)

 

코드

#include <string>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;


int solution(vector<int> priorities, int location) {
    deque<pair<int, int>>print;
    int idx(0);
    vector<int>value(priorities.size(), 0);
    for (idx = 0; idx < priorities.size(); ++idx) {
        print.push_back({ priorities[idx], idx });
        value[idx] = priorities[idx];
    }

    sort(value.begin(), value.end(), greater<>());
    int count(1);
    int value_f(0);
    int value_s(0);
    int value_cnt(0);
    while (!print.empty()) {
        if (print.front().first == value[value_cnt]) {
            if (print.front().second == location)
                return count;
            print.pop_front();
            value_cnt++;
            count++;
        }
        else {
            value_f = print.front().first;
            value_s = print.front().second;
            print.push_back({ value_f, value_s });
            print.pop_front();
        }
    }
}