문제 설명
운영체제가 다음 규칙에 따라 프로세스를 관리할 경우, "특정 위치에 있는 프로세스(location)"가 몇 번째로 실행되는지 알아내어라. (단, 각 프로세스는 우선순위(priorty)를 지닌다)
- 실행 대기 큐에서 대기중인 프로세스 하나를 꺼냅니다.
- 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
- 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다
- 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
규칙에 따라 그대로 구현하면 되는 문제이다. 그러나 C++ STL에 익숙하지 않다면 당황할만한 포인트가 2개 있다;
- 큐에 location과 priorty를 같이 넣으면 편할텐데, queue는 vector와 다르게 여러 개의 인자를 허용하지 않는다.
- queue는 vector처럼 인텍스를 통해 순회할 수 없다. (queue는 배열과 2개의 포인터를 통해 만들어지므로 당연한 사실이기는 하다)
1번 문제는 struct를 통해 해결할 수 있다. 단순히 struct 안에 location과 priorty를 넣고, 그렇게 만들어진 새로운 타입을 queue<new_type> <-- 이런 식으로 넣어주면 된다.
2번 문제는 queue를 복사한 뒤 순회함으로써 해결할 수 있다. 큐가 완전히 비기 전까지 front로 첫 원소를 받은 뒤에, pop을 해주면 모든 원소를 순회할 수 있다.
코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
typedef struct Chunk
{
int location;
int priorty;
} Chunk;
int solution(vector<int> priorities, int location)
{
int order_count = 0;
queue<Chunk> q;
for (int i = 0; i < priorities.size(); i++)
q.push({ i, priorities[i] }); // location, priorty
while (!q.empty())
{
queue<Chunk> copy = q;
Chunk temp = q.front(); q.pop();
bool is_highest = true;
while (!copy.empty())
{
if (copy.front().priorty > temp.priorty)
{
is_highest = false;
q.push(temp);
break;
}
copy.pop();
}
if (is_highest)
{
order_count++;
if (temp.location == location)
{
return order_count;
}
}
}
}