function solution(priorities, location) {
let queue = Array.from({ length: priorities.length }, (v, i) => i);
let max = Math.max(...priorities);
let count = 0;
while(queue.length){
const shiftedLocation = queue.shift();
const shiftedPriority = priorities.shift();
if(shiftedPriority < max){
queue.push(shiftedLocation);
priorities.push(shiftedPriority);
continue;
}
count++;
if(shiftedLocation === location){
return count;
}
max = Math.max(...priorities);
}
}
이 문제는 처음 주어진 priorities
에서 location
인덱스에 해당하는 프로세스가 언제 처리되는지 구하는 것이 목표이다.
여기서 어떤 점을 신경 써야하는지 적어보자면...
따라서, location
은 고정된 지표로 활용하기 매우 힘들다.
즉, 별도의 지표를 만들어줄 필요가 있다.
필자는 두 개의 queue
를 사용하는 것으로 이를 해결했다.
하나의 queue
는 문제에서 주어진 priorities
를 그대로 사용한다.
다른 queue
는 각 프로세스의 초기 인덱스를 담고 있는 것으로, location
과의 비교를 위해 사용한다.
문제 풀이의 원리는 일반적인 큐 문제와 같다.
priorities
에서 shift()
한 프로세스의 우선 순위가 max
보다 작으면 처리하지 않고 priorities
에 push()
한다.
마찬가지로, queue
에 대해서도 동일하게 처리해준다.
이 때, queue
는 초기 프로세스의 인덱스를 담고 있으므로, 순서가 바뀌어도 여전히 특정 프로세스의 location
을 기억하고 있다.
위 과정을 반복하면서 실행 횟수인 count
를 증가시킨다.
이 때, count
는 정상적으로 프로세스가 처리되었을 때만 증가시켜야한다.
그렇지 않으면 처리된게 아니라 다시 큐에 들어온 것까지 실행 횟수로 계산해버리기 때문이다.
만약, 정상 처리된 프로세스의 초기 인덱스, 즉, queue
에 담겨있는 프로세스의 인덱스가
문제에서 주어진 location
과 같다면 이 프로세스가 처리되었을 때의 실행 횟수가 정답이므로
count
를 반환한다.
function solution(priorities, location) {
var arr = priorities.map((priority, index) => {
return {
index: index, priority: priority
};
});
var queue = [];
while(arr.length > 0) {
var firstEle = arr.shift();
var hasHighPriority = arr.some(ele => ele.priority > firstEle.priority);
if (hasHighPriority) {
arr.push(firstEle);
} else {
queue.push(firstEle);
}
}
return queue.findIndex(queueEle => queueEle.index === location) + 1;
}
필자가 초반에 시도했다가, 대소 연산에서 어려움을 겪어 포기했던 접근법이다.
some()
메서드를 사용하셨는데, 왜 이걸 생각 못했을까 싶다.
필자가 생각하는 이상적인 풀이이다!