[ ๐—ฝ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ฒ๐—ฟ๐˜€ ] ๋” ๋งต๊ฒŒ -ํž™(Heap) | JavaScript

NewHaยท2023๋…„ 9์›” 27์ผ
0
post-thumbnail

๐ŸŽฏ ๋ฌธ์ œ ์„ค๋ช…

๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.2 - ๋” ๋งต๊ฒŒ

๋งค์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Leo๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‘ ๊ฐœ์˜ ์Œ์‹์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ž์–ด ์ƒˆ๋กœ์šด ์Œ์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์„ž์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = ๊ฐ€์žฅ ๋งต์ง€ ์•Š์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ + (๋‘ ๋ฒˆ์งธ๋กœ ๋งต์ง€ ์•Š์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ * 2)

Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ K ์ด์ƒ์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์„ž์Šต๋‹ˆ๋‹ค.
Leo๊ฐ€ ๊ฐ€์ง„ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด scoville๊ณผ ์›ํ•˜๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ K๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ž์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๐Ÿฅ… ์ œํ•œ ์‚ฌํ•ญ

  • 2 โ‰ฆscoville์˜ ๊ธธ์ด โ‰ฆ 1,000,000
  • 0 โ‰ฆ K โ‰ฆ 1,000,000,000
  • 0 โ‰ฆ scoville์˜ ์›์†Œ โ‰ฆ 1,000,000
  • ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ return ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ™†๐Ÿปโ€โ™€๏ธ ๋ฌธ์ œ ํ’€์ด

  1. ์ž‘์€ ์Šค์ฝ”๋นŒ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ K๋ณด๋‹ค ์ปค์ง„ ์ˆœ์„œ๋ฅผ ๋นผ๋‚ด์„œ mix๊ฐ’์„ ๊ตฌ๋ž˜์„œ ๋‹ค์‹œ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ์ •๋ ฌํ•œ๋‹ค.
  2. ๋ชจ๋“  ์š”์†Œ๊ฐ€ K๋ณด๋‹ค ์ปค์งˆ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ count๋ฅผ ์„ผ๋‹ค.

Heap ์ •๋ฆฌํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ MinHeap์„ ๊ตฌํ˜„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งฐ์Œ์—๋„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ค‘ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ์ผ€์ด์Šค๋“ค์ด ์žˆ์—ˆ๋‹ค.

์˜ˆ์™ธ์ฒ˜๋ฆฌ 1

  • ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ return ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‰๐Ÿป scoville = [0, 0, 0], K = 3, return 0

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

return minHeap.arr[0] >= K ? count : -1

๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K์ด์ƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, mix ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ 1๊ฐœ๋งŒ ๋‚จ์•˜์„ ๋•Œ๋„ K๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.
๋”ฐ๋ผ์„œ, minHeap.arr[0]์œผ๋กœ mix ํ›„ ๋‚จ์€ ์ง€์ˆ˜๋งˆ์ € K๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ -1์ด ๋‚˜์˜ค๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.

์˜ˆ์™ธ์ฒ˜๋ฆฌ 2

๊ทธ๋Ÿผ์—๋„ 24๋ฒˆ ์ผ€์ด์Šค์™€, ํšจ์œจ์„ฑ์—์„œ ์‹คํŒจ๋ฅผ ํ•ด์„œ Heap ๊ตฌํ˜„ ๋ถ€๋ถ„์„ ์ƒ…์ƒ…ํžˆ ๋’ค์กŒ๋‹ค....๐Ÿ˜ข

    push(val) {
        this.arr.push(val);
        
        let idx = this.arr.length - 1;
        let parentIdx = Math.floor((idx - 1) / 2);
        while (idx > 0 && this.arr[parentIdx] > this.arr[idx]){
            [this.arr[idx], this.arr[parentIdx]] = [this.arr[parentIdx], this.arr[idx]];
            idx = parentIdx;
        }
    }

๊ทธ ๊ฒฐ๊ณผ push ๋ฉ”์†Œ๋“œ ์•ˆ์— parentIdx๊ฐ€ ๊ฐฑ์‹ ์ด ๋˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค...๐Ÿ˜‚

๐Ÿ‘€ ์ตœ์ข… ์ฝ”๋“œ

class MinHeap {
    constructor() {
        this.arr = [];
    }
    
    push(val) {
        this.arr.push(val);
        let idx = this.arr.length - 1;
        
        while (idx > 0){
            let parentIdx = Math.floor((idx - 1) / 2);
            if(this.arr[idx] >= this.arr[parentIdx]) break;
            [this.arr[idx], this.arr[parentIdx]] = [this.arr[parentIdx], this.arr[idx]];
            idx = parentIdx;
        }
    }
    
    pop() {
        if(this.arr.length === 1) return this.arr.pop();
        let min = this.arr[0];
        this.arr[0] = this.arr.pop();
        let cur = 0;
        
        while(cur * 2 + 1 < this.arr.length) {
            let minChild = cur * 2 + 2 < this.arr.length 
            && this.arr[cur * 2 + 2] < this.arr[cur * 2 + 1] ? 
            cur * 2 + 2 : cur * 2 + 1;
            
            if(this.arr[cur] < this.arr[minChild]) break;
        
            [this.arr[cur], this.arr[minChild]] = [this.arr[minChild], this.arr[cur]];
            cur = minChild;
        }
        return min;
    }
}

function solution(scoville, K) {
    const minHeap = new MinHeap();
    scoville.forEach(el => minHeap.push(el))
    
    let count = 0;
    while(minHeap.arr[0] < K && minHeap.arr.length > 1) {
        let fir = minHeap.pop();
        let sec = minHeap.pop();
        let mix = fir + (sec * 2);
        
        minHeap.push(mix);
        count++;
    }
    return minHeap.arr[0] >= K ? count : -1
}
  • ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด Heap ๊ตฌ์กฐ๋งŒ ์ƒ๊ฐํ•˜๋ฉด์„œ ๋„์›€ ์—†์ด ๊ตฌํ˜„ํ•ด๋ด์•ผ๊ฒ ๋‹ค.


profile
๋ฐฑ ๋ฒˆ์„ ๋ณด๋ฉด ํ•œ ๊ฐ€์ง€๋Š” ์•ˆ๋‹ค ๐Ÿ‘€

0๊ฐœ์˜ ๋Œ“๊ธ€