코딩테스트 연습 - 프린터 | 프로그래머스 스쿨 (programmers.co.kr)
난이도 : Level 2
문제 설명 :
백준 1966번과 매우 유사한 문제다
3달 전에 낑낑대면서 풀었었는데 이번에 다시 푸니까 푸는데 굉장히 오래 걸렸다..😥
이 문제는 문제 해석이 좀 어려울 수 있는데,
문서를 순서대로 출력하는데, 우선순위를 고려해서 문서를 출력해야한다.
문서를 출력하려고 할 때 이 후 우선순위가 더 높은 문서가 있다면
현재 출력해야 하는 문서는! 프린터 큐 뒤에 들어간다.
두번째 입출력 예시를 보면 , 아래와 같은데
[1, 1, 9, 1, 1, 1] | 0 |
문서가 춘서대로 0 1 2 3 4 5 로 출력된다고 치면
0번을 출력하려고 할때 2번 문서의 우선순위가 더 높기 때문에 0번은 뒤로 빠져 프린터 큐에 들어간다.
그러면 0 1 2 3 4 5 => 1 2 3 4 5 0
이 후 1번을 출력하려고 할 때 마찬가지로 2번 우선순위가 높기 때문에 뒤로 빠진다.
1 2 3 4 5 0 => 2 3 4 5 0 1
이 후엔 우선순위 순으로 출력될 수 있기에
최종적으로 0번 문서는 5번째에 출력되게 된다.
문제 풀이 :
나는 C++에서 풀었던 것 처럼 큐를 이용해서 풀 생각이기 때문에 큐를 직접 구현을 해주었다.
그리고 큐에 [인덱스, 우선순위] 형태로 enqueue(push)를 해주었고,
우선순위 배열은 내림차순 정렬을 해주었다.
이후 큐가 빌 때까지
큐의 front(peek)를 순회하면서 만약 priorities보다 우선순위가 작다면 dequeue 후 다시 enqueue해주는 과정을 해준다.
만약 출력하려는 문서가 더 우선순위가 크다면(else문) 그대로 큐에서 출력해주고,
만약 그 idx(인덱스)가 우리가 알고싶은 문서의 인덱스와 같다면 cnt값을 출력해주면 된다.
코드 :
class Queue {
constructor() {
this.queue = [];
this.front = 0;
this.rear = 0;
}
enqueue(value) {
this.queue[this.rear++] = value;
}
dequeue(){
const value = this.queue[this.front];
delete this.queue[this.front];
this.front++;
return value;
}
peek() {
return this.queue[this.front];
}
size() {
return this.rear-this.front;
}
}
function solution(priorities, location) {
let q = new Queue();
for(let i=0;i<priorities.length;i++) q.enqueue([i, priorities[i]]);
priorities.sort((a,b)=>b-a);
let cnt = 0;
while(q.size()>0){
let idx = q.peek()[0];
let pri = q.peek()[1];
if(priorities[cnt] > pri){
q.enqueue(q.dequeue());
}else{
let num = q.dequeue();
cnt++;
if(location === idx){
return cnt;
}
}
}
return cnt;
}
'Algorithm > Solution' 카테고리의 다른 글
[프로그래머스] 가장 먼 노드(JavaScirpt) (0) | 2022.10.21 |
---|---|
[프로그래머스] 베스트앨범 (JavaScript) (0) | 2022.10.20 |
[백준] 4179 불!(C++) (2) | 2022.09.30 |
[백준] 1406 에디터(C++) (0) | 2022.09.20 |
[백준] 2792 보석 상자(C++) (0) | 2022.08.22 |