프로그래머스 Level 2 | 더 맵게 | Python

kimminjunnn·2025년 9월 29일

알고리즘

목록 보기
191/311
post-thumbnail

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42626


문제 파악

scoville 이라는 숫자가 들어있는 배열을 입력 받고,
스코빌 지수 K를 입력받는다.

Leo라는 사람은 scovile 안에 숫자를 합쳐서 모든 숫자가 K 이상으로 만들고 싶다.

숫자를 합치는 방식은 이렇다.
A 가장 값이 낮은 숫자를 하나 뽑고,
B 그다음 낮은 값의 숫자 하나 뽑은뒤 2를 곱한다.
A * 2B 를하면 숫자를 합칠 수 있다.

모든 숫자가 K이상이 될때 몇번 숫자를 합쳐야하는 지를 return 하는 문제


해결 아이디어

최솟값들을 뽑아내야 하니 파이썬에서는 heapq 라이브러리를 쓰면 편하다.

heapq.heappop() 메소드를 사용하면 heapq 배열 안에 최솟값을 뽑아준다.

해답 및 풀이

import heapq

def solution(scovile, K):
    heapq.heapify(scovile) # scovile 배열을 heap 자료구조로 변환

    cnt = 0    
    
    # 힙의 최솟값이 K 이상이 될 때까지 섞기
    # 매번 2개를 꺼내야 하므로 len(scovile) >= 2 조건도 함께 확인
    
    while len(scovile) >=2 and scovile[0] < K: # heap구조에서는 [0]이 최솟값임
        min_s = heapq.heappop(scovile)
        next_min_s = heapq.heappop(scovile)
    
        new_s = min_s + (next_min_s * 2)
        heapq.heappush(scovile,new_s)
        cnt += 1

    if len(scovile) > 0 and scovile[0] >= K:
        return cnt
    else:
        return -1
    

나의 답은 이 코드였는데 더 좋은 코드가 있어서 가져와본다.

import heapq as hq

def solution(scoville, K):

    hq.heapify(scoville)
    answer = 0
    while True:
        first = hq.heappop(scoville)
        if first >= K:
            break
        if len(scoville) == 0:
            return -1
        second = hq.heappop(scoville)
        hq.heappush(scoville, first + second*2)
        answer += 1  

    return answer

이 코드는 while True와 break을 써서 최소값이 K 이상인지를 확인한 후 return answer로 바로 넘어가게 해줬고,
len(scovile)이 -이면 바로 return -1 처리를 해주었다.

나도 다음에 while True, break, 얼리리턴을 적용해봐야겠다.

profile
Frontend Engineers

0개의 댓글