FrontEnd/프로그래머스

[JS] 더 맵게!

728x90

생각보다 되게 오래 헤맨 문제였다... 원인은 별거 아니었지만

 

 

우선 문제분류도 그렇고 내용도 그렇고 내놓고 최소힙을 구현해보란 문제였다. 딱히 최대,최소 힙 라이브러리가 없는 JS 특성상 힙을 직접 구현해보았다.

 

내가 실수한점은 두곳이었다.

 

첫번째로 문제를 제대로 안읽은 게 잘못이었다. 스코빌 지수가 다 섞어도 원하는 스코빌 지수가 안나오는 경우가 있는데 해당 경우를 다 무시해버렸었다..

 

추가적으로 스코빌 이상인지 초과인지 제대로 파악을 안했어서 테스트 케이스가 잘 통과가 안되었었다.

 

 

문제를 파악을 제대로 못했는데 애꿏은 힙부분만 계속 건드렸으니 ㅠㅠ

 

힙 부분에서 실수한 곳은 한 점이었다.

 

 

 

[1,1] , 3 이렇게 테스트 케이스를 넣으면 답이 정상적으로 나오지 않았다.

 

 

힙 안의 값이 1개밖에 없다면 그냥 pop을 해주면 되는데 그 처리를 안해준 것이 잘못이었다.

 

 

 

 

 

class MinHeap {
    
    constructor() {
        this.ary = [0]
        this.size = 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.size
        
        while (idx>0 && this.ary[idx] <= this.ary[~~(idx/2)]){
            this.swap(idx,~~(idx/2))
            idx = ~~(idx/2)
        }
    }
    
   pop() {
        if (this.size == 1) {
            this.size --
            return this.ary.pop()
        }
        const ret = this.ary[1]
        this.ary[1] = this.ary.pop()
        let idx = 1
        this.size-=1
       
        while (idx*2 <= this.size) {
             const [left,right] = [idx*2,idx*2+1]
             let minIdx = left
             if (right <= this.size && this.ary[right] < this.ary[left]) minIdx = right
             
             if (this.ary[minIdx] < this.ary[idx]){
                 this.swap(idx,minIdx)
                 idx = minIdx
             } else break
        }
            return ret
        }
    get() {
        return this.ary[1]
    }
    
}


function solution(scoville, K) {
    const heap = new MinHeap()
    
    for (const food of scoville) {
        heap.push(food)
    }
    
    
    let ret = 0
    
    while (heap.get() < K) {
        if (heap.size <= 1) return -1; // 예외 처리: 스코빌 지수를 만들 수 없는 경우
        heap.push(heap.pop() + heap.pop() * 2)
        ret +=1
    }
    
    return ret
}
728x90

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

[JS] 전화번호 목록  (0) 2023.07.28
[JS] 주식 가격  (0) 2023.07.27
[JS] 하노이의 탑  (0) 2023.07.22
[JS] N-Queen  (0) 2023.07.21
[JS] N개의 최소공배수  (0) 2023.07.21