일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities
와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location
이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
|priorities|location|return|
|[2, 1, 3, 2]|2|1|
|[1, 1, 9, 1, 1, 1]|0|5|
function solution(priorities, location) {
let result = 0;
while (priorities.length) { // 배열이 비어있을 때까지
const temp = priorities.shift(); // 왼쪽 항목부터 빼기
if (temp < Math.max(...priorities)) { // 해당 항목보다 중요도 높은 항목이 있다면
priorities.push(temp); // 맨 뒤로 보내기
if (location === 0) location = priorities.length - 1; // location도 맨 뒤로 보내기
else location--;
} else {
result++;
if (location === 0) break; // 원하는 항목이 출력됨
else location--;
}
}
return result;
}
// 배웠던 다른사람의 풀이
// key-value로 위치-우선순위로 저장하는 방식
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;
}