Recent Posts
Recent Comments
게으른개발너D
[JS] Heap - 더 맵게 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42626
문제 설명
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
입출력 예
scoville | K | return |
[1, 2, 3, 9, 10, 12] | 7 | 2 |
solution 1
우선순위 큐
class Heap {
constructor() {
this.items = [];
}
swap(index1, index2) {
[this.items[index1], this.items[index2]] = [
this.items[index2],
this.items[index1],
];
}
insert(val) {
this.items.push(val);
let index = this.items.length - 1;
while (true) {
let parentIndex = Math.floor((index - 1) / 2);
//부모보다 자식이 작으면 자리 바꾸기
if (this.items[index] < this.items[parentIndex]) {
this.swap(index, parentIndex);
} else break;
index = parentIndex;
if (index < 1) break;
}
}
removeMin() {
this.items[0] = this.items[this.items.length - 1];
this.items.pop();
if (this.items.length <= 1) return;
let index = 0;
while (true) {
//두 자식중 작은값의 자식 인덱스 찾기
let lChildIndex = index * 2 + 1;
let rChildIndex = index * 2 + 2;
let minIndex = index;
if (
lChildIndex < this.items.length &&
this.items[minIndex] > this.items[lChildIndex]
) {
minIndex = lChildIndex;
}
if (
rChildIndex < this.items.length &&
this.items[minIndex] > this.items[rChildIndex]
) {
minIndex = rChildIndex;
}
//위치 바꾸기
if (minIndex !== index) {
this.swap(index, minIndex);
index = minIndex;
} else break;
}
}
}
function solution(scoville, K) {
let answer = 0;
//힙생성과 scoville 힙에 저장
let scovilleHeap = new Heap();
scoville.forEach((el) => {
scovilleHeap.insert(el);
});
//스코빌 지수 설정
while (true) {
if (scovilleHeap.items[0] >= K) break;
if (scovilleHeap.items.length <= 1) {
answer = -1;
break;
}
const low1 = scovilleHeap.items[0];
scovilleHeap.removeMin();
const low2 = scovilleHeap.items[0];
scovilleHeap.removeMin();
scovilleHeap.insert(low1 + low2 * 2);
answer++;
}
return answer;
}
solution 2
function solution(scoville, K) {
let answer = 0;
const len = scoville.length;
const heapSt = (arr, i, size) => {
let smallest = i;
const left = 2 * i + 1;
const right = 2 * i + 2;
if (left < size && arr[left] < arr[smallest]) smallest = left;
if (right < size && arr[right] < arr[smallest]) smallest = right;
if (smallest !== i) {
[arr[i], arr[smallest]] = [arr[smallest], arr[i]];
heapSt(arr, smallest, size);
}
}
for(let i = Math.floor(len / 2); i >= 0; i--) {
heapSt(scoville, i, len);
}
while(scoville[0] < K) {
if (scoville.length < 2) return -1;
const a = scoville[0];
[scoville[0], scoville[scoville.length - 1]] = [scoville[scoville.length - 1], scoville[0]];
scoville.pop();
heapSt(scoville, 0, scoville.length);
const b = scoville[0];
scoville[0] = a + b * 2;
heapSt(scoville, 0, scoville.length);
answer++;
}
return answer;
}
'알고리즘 > 문제' 카테고리의 다른 글
[JS] Greedy - 구명보트 (0) | 2023.09.08 |
---|---|
[JS] Heap - 디스트 컨트롤러 (0) | 2023.09.07 |
[JS] Stack/ Queue - 주식가격 (0) | 2023.09.06 |
[JS] Stack/ Queue - 다리를 지나는 트럭 (0) | 2023.09.06 |
[JS] Stack/ Queue - 프로세스 (0) | 2023.09.06 |
Comments