250x250
반응형
Notice
Recent Posts
Recent Comments
Link
N
(프로그래머스 JS)야근 지수 본문
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/12927?language=javascript
최대힙(max heap)을 이용한 문제 풀이.
최대힙을 클래스로 구현하고, 이 힙에 works의 요소를 하나씩 push한다.
push하게 되면 알아서 최대힙으로 정렬이 된다.
이후 n만큼 반복하면서 힙을 순회한다.
pop()을 하게 되면 가장 큰 수가 앞에 나오게 되며,
해당 일이 0이 아닌 경우 -1을 하여 다시 힙에 넣어주게 된다.
(일의 양이 0인 경우 끝났기 때문에)
n만큼 반복했다면 이제 남아있는 일의 야근 지수를 구하면 된다.
heap을 빌 때까지 while문을 돌면서
남아있는 일의 양을 제곱하여 answer에 넣어주면 끝!
class PriorityQueue {
constructor(){
this.queue = [0];
this.size = 0;
}
push(value) {
this.queue.push(value);
this.size++;
this.moveUp(this.size);
}
moveUp(index){
while(Math.floor(index / 2)){
const parent = Math.floor(index / 2);
if(this.queue[parent] < this.queue[index]){
[this.queue[parent], this.queue[index]] = [this.queue[index], this.queue[parent]];
}
index = parent;
}
}
pop() {
const maxValue = this.queue[1];
this.queue[1] = this.queue[this.size];
this.queue.pop();
this.size--;
this.moveDown(1);
return maxValue;
}
moveDown(index) {
while(index * 2 <= this.size){
const maxChildIndex = this.findMaxChildIndex(index);
if(this.queue[index] < this.queue[maxChildIndex]){
const tmp = this.queue[maxChildIndex];
this.queue[maxChildIndex] = this.queue[index];
this.queue[index] = tmp;
}
index = maxChildIndex;
}
}
findMaxChildIndex(index) {
const left = index * 2;
const right = (index * 2) + 1;
if(right > this.size){
return left;
} else{
if(this.queue[right] > this.queue[left]){
return right;
} else{
return left;
}
}
}
}
function solution(n, works) {
let answer = 0;
const heap = new PriorityQueue();
for(let i = 0; i < works.length; i++){
heap.push(works[i]);
}
for(let i = 0; i < n; i++){
const work = heap.pop();
if(work !== 0){
heap.push(work - 1);
}
}
while(heap.size){
const work = heap.pop();
answer += (work ** 2);
}
return answer;
}
728x90
반응형
'프로그래머스 알고리즘 > 3단계' 카테고리의 다른 글
(프로그래머스 JS)억억단 구하기 (0) | 2023.02.13 |
---|---|
(프로그래머스 JS)최적의 행렬 곱셈 (0) | 2022.07.17 |
(프로그래머스 C++)다단계 칫솔 판매 (0) | 2022.04.13 |
(프로그래머스 JS)다단계 칫솔 판매 (0) | 2022.03.23 |
(프로그래머스 JS)스티커 모으기(2) (0) | 2022.01.07 |