https://school.programmers.co.kr/learn/courses/30/lessons/42626#
모든 음식의 스코빌 지수를 K 이상으로 만들기위해 다음과 같은 방법으로 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
index와 배열을 활용
function solution(scoville, K) {
let count = 0;
let newScoville = [];
scoville.sort((a,b)=>a-b);
let sIndex = 0;
let newIndex = 0;
// 1. 새로운 스코빌 지수를 만들 수 있어야 함
// 2. 현재 인덱스의 스코빌 지수가 k보다 작아야 함
while(
(scoville.length - sIndex + newScoville.length - newIndex) >= 2 &&
(scoville[sIndex] < K || newScoville[newIndex] < K)
) {
// 스코빌과 새로운 스코빌 2개를 뽑아야 함
let sFirst;
let sSecond;
let newFirst;
let newSecond;
if(sIndex < scoville.length) sFirst = scoville[sIndex];
if(sIndex+1 < scoville.length) sSecond = scoville[sIndex+1];
if(newIndex < newScoville.length) newFirst = newScoville[newIndex];
if(newIndex+1 < newScoville.length) newSecond = newScoville[newIndex+1];
// 기존에서 2개를 빼는 경우
if (
newScoville.length === 0 || // 뉴 스코빌이 없음
newScoville.length <= newIndex || // 뉴 스코빌이 인덱스를 벗어난 경우
(newFirst >= sSecond && sSecond !== undefined) // newFirst sSecond가 작거나 같을 때, sSeconde가 있는 경우
) {
sIndex += 2;
newScoville.push(sFirst+sSecond*2);
} else if ( // 뉴 스코빌에서 2개를 빼는 경우
scoville.length <= sIndex || // 스코빌이 인덱스를 벗어난 경우
newSecond !== undefined &&
newSecond <= sFirst
) {
newIndex += 2;
newScoville.push(newFirst+newSecond*2);
} else { // 각각 뽑는 경우
sIndex += 1;
newIndex += 1;
sFirst < newFirst
? newScoville.push(sFirst+newFirst*2)
: newScoville.push(newFirst+sFirst*2);
}
count++;
}
return (scoville[sIndex] < K || newScoville[newIndex] < K) ? -1 : count;
}
python
import heapq
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
while True:
fir = heapq.heappop(scoville)
if fir >= K :
break
if len(scoville) == 0:
return -1
second = heapq.heappop(scoville)
heapq.heappush(scoville, fir + second*2)
answer += 1
return answer
```