[programmers/js, py] 더 맵게

승민·2024년 1월 15일

알고리즘

목록 보기
44/171

더 맵게

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
```

0개의 댓글