
๋งค์ด ๊ฒ์ ์ข์ํ๋ Leo๋ ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๋ฅผ K ์ด์์ผ๋ก ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๋ฅผ K ์ด์์ผ๋ก ๋ง๋ค๊ธฐ ์ํด Leo๋ ์ค์ฝ๋น ์ง์๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ ๊ฐ์ ์์์ ์๋์ ๊ฐ์ด ํน๋ณํ ๋ฐฉ๋ฒ์ผ๋ก ์์ด ์๋ก์ด ์์์ ๋ง๋ญ๋๋ค.
์์ ์์์ ์ค์ฝ๋น ์ง์ = ๊ฐ์ฅ ๋งต์ง ์์ ์์์ ์ค์ฝ๋น ์ง์ + (๋ ๋ฒ์งธ๋ก ๋งต์ง ์์ ์์์ ์ค์ฝ๋น ์ง์ * 2)
Leo๋ ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๊ฐ K ์ด์์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ์ฌ ์์ต๋๋ค.
Leo๊ฐ ๊ฐ์ง ์์์ ์ค์ฝ๋น ์ง์๋ฅผ ๋ด์ ๋ฐฐ์ด scoville๊ณผ ์ํ๋ ์ค์ฝ๋น ์ง์ K๊ฐ ์ฃผ์ด์ง ๋, ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๋ฅผ K ์ด์์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์์ด์ผ ํ๋ ์ต์ ํ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
scoville์ ๊ธธ์ด โฆ 1,000,000 K โฆ 1,000,000,000scoville์ ์์ โฆ 1,000,000K ์ด์์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์๋ -1์ return ํฉ๋๋ค.
- ์์ ์ค์ฝ๋น ์์ผ๋ก ์ ๋ ฌํด์ K๋ณด๋ค ์ปค์ง ์์๋ฅผ ๋นผ๋ด์ mix๊ฐ์ ๊ตฌ๋์ ๋ค์ ๋ฐฐ์ด์ ๋ฃ์ด์ ์ ๋ ฌํ๋ค.
- ๋ชจ๋ ์์๊ฐ K๋ณด๋ค ์ปค์ง๋๊น์ง ๋ฐ๋ณตํ๋ฉด์ count๋ฅผ ์ผ๋ค.
Heap ์ ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก MinHeap์ ๊ตฌํํด์ ์ฝ๋๋ฅผ ์งฐ์์๋ ํ ์คํธ ์ผ์ด์ค ์ค ํต๊ณผํ์ง ๋ชปํ๋ ์ผ์ด์ค๋ค์ด ์์๋ค.
- ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๋ฅผ 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์ด ๋์ค๋๋ก ์กฐ๊ฑด๋ฌธ์ ๋ง๋ค์ด ์ฃผ์๋ค.
๊ทธ๋ผ์๋ 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
}