FrontEnd/프로그래머스

[JS] 야근 지수

728x90

 

힙을 활용해서 해결하였다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/12927

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

야근지수를 가장 낮게 받는 방법은 생각보다 간단하다. 현재 남은 피로도 중에서 가장 큰값부터 피로도를 깎으면 된다.

문제 조건또한 1000000정도라서 시간도 충분할꺼라 생각했다.

 

이런 문제는 이분탐색을 활용해도 되고 힙을 활용해도 되는데 힙을 활용했다.

 

우선순위 큐를 활용하여 해결하였다.

 

 

 

 

class MaxHeap {
    constructor(){
        this.ary = [0]
    }
    swap(a,b) {
        [this.ary[a],this.ary[b]] = [this.ary[b],this.ary[a]]
    }
    push(value){
        this.ary.push(value)
        let idx = this.ary.length - 1
        while(idx>1){
            const parent = ~~(idx/2)
            if(this.ary[parent]>=this.ary[idx]) break
            this.swap(parent,idx)
            idx = parent
        }
    }
    pop(){
        if(this.ary.length===1) return undefined
        if(this.ary.length===2) return this.ary.pop()
        const ret = this.ary[1]
        this.ary[1] = this.ary.pop()
        let idx = 1
        while(idx < this.ary.length){
            const [left,right] = [idx*2,idx*2+1]
            let maxIdx = left
            if(left >= this.ary.length) break
            if(right < this.ary.length && this.ary[right] > this.ary[left])
                maxIdx = right
            if(this.ary[maxIdx] <= this.ary[idx]) break
            this.swap(maxIdx,idx)
            idx = maxIdx
        }
        return ret
    }
}

function solution(n, works) {
	//힙 생성
    const heap = new MaxHeap()
    for (const work of works){
        heap.push(work)
    }
    
    //가장 큰값의 수를 줄임
    for (let i = 0 ; i < n ; i++){
        const num = heap.pop()
        if (num>1) heap.push(num-1)
    }
    
    //힙에 남은 값들 다 더하기
    return heap.ary.reduce((a,c) => a+c**2 , 0)
    
 
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 산 모양 타일링 (카카오 겨울 인턴십)  (0) 2024.01.19
[JS] 이중우선순위큐  (0) 2024.01.17
[JS] 단속카메라  (0) 2024.01.14
[JS] 도넛과 막대 그래프  (1) 2024.01.12
[JS] 등굣길  (0) 2024.01.11