중요도가 높은 순서대로 먼저 프린트를 한다. 각각의 문서에 숫자가 매겨져 있는데, 숫자가 높을 수 록 중요도가 높아진다. 그래서 중요도가 가장 높은 문서가 가장 먼저 프린트 된다. 이때 location(idx)에 해당되는 문서가 몇번째로 출력되는지 리턴하면 된다. 만약, 자신보다 중요도가 더 높은 문서가 있으면 자신은 대기줄 맨 뒤에 배치된다.
예를 들어서 아래와 같이 중요도가 pass되었다고 해보자.
중요도 location
[2, 1, 3, 2] 2
이때 location이 2에 해당되는, 즉 idx 2에 위치한 문서가 몇번째로 출력되는지 확인하면 된다. 가장 높으니깐 1이다. 만약 location이 0에 해당되는 문서는 어떻게 될까?
2 1 3 2
1 3 2 2
3 2 2 1 --> L:2 출력
2 2 1 --> L:3 출력
2 1 --> L:0 출력
1
==> 3번째로 출력됨!
그럼 코드로 구현해보자!
targetIdx를 잘 활용한다. targetIdx로 priorities가 바뀌더라도 L의 위치를 놓치지 않고 따라간다.
function print(pri, L) {
let targetIdx = L;
let print = 0;
let first;
while (pri.length) {
first = pri.shift();
if (pri.some((value) => value > first)) {
pri.push(first);
} else {
answer++;
if (targetIdx === 0) break;
}
if (targetIdx === 0) {
taragetIdx = pri.length - 1;
} else {
targetIdx--;
}
}
return print;
}
location의 변화과정을 그림으로 그리면서 잘 관찰하면 idx가 점점 감소한다는 것을 알 수 있다.
실제 큐를 통해서도 구현해보았다
function solution(priorities, location) {
let answer = 0;
let targetIdx = location;
let pop;
let queLength;
const que = new Queue();
priorities.forEach((val, idx) => {
que.enqueue([val, idx]);
});
priorities.sort((a, b) => b - a);
// queLength = que.size;
// console.log(que);
while (true) {
const currentValue = que.peek();
if (currentValue[0] < priorities[count]) {
que.enqueue(que.dequeue());
} else {
const value = que.dequeue();
answer++;
if (location === value[1]) {
return answer;
}
}
}
return answer;
}
class Node {
constructor(val) {
this.val = val;
this.next = null;
}
}
class Queue {
constructor() {
this.first = null;
this.last = null;
this.size = 0;
}
enqueue(val) {
var newNode = new Node(val);
if (!this.first) {
this.first = newNode;
this.last = newNode;
} else {
this.last.next = newNode;
this.last = newNode;
}
return ++this.size;
}
dequeue() {
if (!this.first) return null;
var temp = this.first;
if (this.first === this.last) {
this.last = null;
}
this.first = this.first.next;
this.size--;
return temp.val;
}
peek() {
return this.first.val;
}
}
끝!