본문 바로가기
알고리즘 공부/프로그래머스 [C++]

프로그래머스 : 프린터 [C++]

by 이포터 2022. 11. 8.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42587?language=cpp

 

문제 설명

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

 

문제 입출력 예)

priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5

 

문제 풀이

queue에 pair을 사용해서, 고유 index값으로 해당 원소가 몇번 째에

출력이 되는지 찾으려고 했다. 그 이후 우선순위 큐에 있는 최대 값과 비교해서

같은 값이라면, 출력을 시키고, 문제에서 주어진 고유 index의 값과 같은지 판단하였다.

지금 생각해보니, priority_queue를 이용해서 하는 것이 아닌 배열의 max_element로 풀 수 있었던 문제였다.

 

#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(vector<int> priorities, int location) {
    int answer = 0;
    
    // 고유 index값과 value값을 받기 위한 queue
    queue<pair<int,int>> q;
    
    // 우선순위(높은값)과 비교하기 위한 pq
    priority_queue<int, vector<int>> pq;
    
    // 문제에서 주어진 값을 queue와 priority_queue에 넣어준다.
    for(int i=0; i<priorities.size(); i++){
        q.push(make_pair(i,priorities[i]));
        pq.push(priorities[i]);
    }
    
    // 정답이 나올 때까지 반복문을 돌려준다.
    while(1){
        
        // 이번 인덱스보다 더 높은 우선순위를 가진 값이 있다면,
        // 맨 뒤에 queue에 넣어준다.
        if(q.front().second < pq.top()){
            int index = q.front().first;
            int value = q.front().second;
            q.pop();
            q.push(make_pair(index,value));
        }
        else{
            // 해당 인덱스와 같은 값이라면 반복문을 빠져나온다.
            if(q.front().first == location){
                answer++;
                break;
            }else {
                q.pop();
                pq.pop();
                answer++;    
            }
        }
    }
    return answer;
}

 

리뷰

프로그래머스,, 하면할수록 어렵다,,

댓글