문제 설명

운영체제가 우선순위 큐로 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 return

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이법

문제 설명에도 나와있듯이 queue를 통해서 문제를 풀었다

우선순위대로 실행이 되고 특정 프로세스의 위치를 알아야 하는 것이 핵심이었다

 

우선 queue에 vector에 있는 값들을 순서대로 넣어준다

그리고 우선순위를 알기 위해 vector의 값들을 내림차순 정렬을 해준다

특정 프로세스의 위치를 업데이트 하기 위한 loc 변수도 설정해준다

 

이제 queue가 비어있지 않을동안 계속 반복하는 while 문 안에 다음과 같은 로직을 작성해준다

 

우선 내림차순된 vector의 맨 앞의 수와 queue의 front가 같은지 확인한다

같다면 우선순위가 가장 큰 것이 실행된다는 뜻이므로 queue를 pop해주고 answer을 + 1 해준다

만일 이때 loc == 0이라면, 내가 찾는 특정 프로세스가 실행된다는 뜻이므로 바로 answer을 return 해준다

아니라면, 내림차순된 vector을 가리키는 인덱스 i를 + 1 해주고, loc도 - 1 해준다

 

내림차순된 vector의 맨 앞의 수와 queue의 front가 같지않다면, queue의 front 값을 push 해준뒤, pop 해준다

ex) 2-3-1-2 -> 3-1-2-2

이때 loc도 - 1 해주는데, 만일 loc < 0이라면, 특정 프로세스가 맨 뒤로 같다는 뜻이므로 queue.size() - 1 로 초기화해준다

 

소스 코드

#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

bool cmp(int a, int b) {
    return a > b;
}

int solution(vector<int> priorities, int location) {
    int answer = 0;
    queue<int> q;
    
    for (int i = 0; i < priorities.size(); i++)
        q.push(priorities[i]);
    
    sort(priorities.begin(), priorities.end(), cmp);
    
    int i = 0;
    int loc = location;
    
    while(!q.empty()) {
        if (priorities[i] == q.front()) {
            q.pop();
            answer++;
            if (loc == 0)
                return answer;
            i++;
            loc--;
        }
        else {
            q.push(q.front());
            q.pop();
            loc--;
            if (loc < 0)
                loc = q.size() - 1;
        }
    }
    
    
    return answer;
}
복사했습니다!