알고리즘 문제/C++

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

lingk 2020. 12. 18. 21:17

문제

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr


코드

int solution(vector<int> priorities, int location) {
    int answer = 0;
    priority_queue<int> pri_q;
    queue<pair<int, int>> que;
    
    for(int i = 0;i<priorities.size();++i)
    {
        pri_q.push(priorities[i]);
        que.push(make_pair(i,priorities[i]));
    }
    
    while (!que.empty())
    {
        if(que.front().second == pri_q.top())
        {
            if(que.front().first == location)
                return answer + 1;
            else
            {
                answer++;
                que.pop();
                pri_q.pop();
            }
        }
        else
        {
            que.push(que.front());
            que.pop();
        }
    }
    return answer;
}

int main(void)
{
    vector<int> a = {1, 1, 9, 1, 1, 1};
    cout << solution(a, 0);
}

 

큐와 우선순위 큐를 사용하였다. priority_queue는 데이터를 자동으로 정렬해준다. 인자로 들어온 priorities를 priority_que에 넣어주어 정렬된 값으로 저장하고, queue에는 index와 함께 priorities를 저장해주었다. 이 때, pair 클래스 개념을 사용하였다.

for(int i = 0;i<priorities.size();++i)
{
    pri_q.push(priorities[i]);
    que.push(make_pair(i,priorities[i]));
}
더보기

pair 클래스

- make_pair

- first

- second

위 세가지 개념만 알면 사용할 수 있다❗️❗️데이터를 '쌍'으로 표현할 때 사용한다. make_pair로 저장할 때 묶어주고, 접근할 때에는 first와 second를 사용하면 된다.

 

우선 첫번째로 que의 second데이터와 pri_q의 top을 비교해준다. pri_q는 내림차순으로 숫자가 정렬되어 있기 때문에, top에는 가장 큰 숫자가 들어있다.

que의 second데이터(priorities)와 pri_q가 같지 않다면 해당 데이터보다 우선순위가 높은 데이터가 존재한다는 뜻이다. 따라서 해당 데이터의 front를 먼저 push해준 다음에 pop을한다.

que의 second데이터(priorities)와 pri_q가 같다면 해당 데이터는 우선순위가 가장 높은 데이터이다. 이 때, que의 first데이터(index)가 location과 다르다면 answer는 ++해주고, que와 pri_q에 있는 데이터를 모두 pop해준다. (pop하는 과정은 우선순위가 높은 데이터를 프린트 했다고 생각하면 된다🧐) que의 first데이터(index)가 location가 같다면, 해당 데이터는 인쇄를 요청한 데이터이기 때문에 answer에 +1을 하면서 return 해주면 된다.

 

    while (!que.empty())
    {
        if(que.front().second == pri_q.top())
        {
            if(que.front().first == location)
                return answer + 1;
            else
            {
                answer++;
                que.pop();
                pri_q.pop();
            }
        }
        else
        {
            que.push(que.front());
            que.pop();
        }
    }

 

while문이 끝났지만 해당 함수를 탈출하지 못한 경우는 location이 주어진 데이터의 수보다 클때, 또는 주어진 벡터에 데이터가 없을 때이다.

 

 

반응형