코딩테스트/프로그래머스

[프로그래머스] 프로세스 (C++)

QuickClid 2025. 4. 8. 08:49

문제 설명

운영체제가 다음 규칙에 따라 프로세스를 관리할 경우, "특정 위치에 있는 프로세스(location)"가 몇 번째로 실행되는지 알아내어라. (단, 각 프로세스는 우선순위(priorty)를 지닌다)

  1. 실행 대기 큐에서 대기중인 프로세스 하나를 꺼냅니다.
  2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
  3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다
  4. 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


풀이

규칙에 따라 그대로 구현하면 되는 문제이다. 그러나 C++ STL에 익숙하지 않다면 당황할만한 포인트가 2개 있다;

  1. 큐에 location과 priorty를 같이 넣으면 편할텐데, queue는 vector와 다르게 여러 개의 인자를 허용하지 않는다.
  2. 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;
			}
		}
	}
}