본문 바로가기
프로그래머스/고득점 Kit

[프로그래머스] 더 맵게 - Python / 파이썬

by yewonnie 2023. 1. 18.

문제 설명 

📄문제 링크 

매운 것을 좋아하는 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

문제 풀이 

스코빌 지수가 가장 낮은 두 개의 음식을 섞어야 하고 섞은 음식의 스코빌 지수를 다시 스코빌 지수에 추가해주어야 한다. 

즉, 값이 추가 될때마다 계속해서 스코빌 지수가 저장된 배열이 가장 작은 값부터 정렬되도록 해야한다. 

 

가장 작은 값 부터 정렬된다? = MinHeap

이 문제는 MinHeap으로 쉽게 해결할 수 있다. 

파이썬이 제공하는 heapq 라이브러리는 기본적으로 MinHeap 구조이므로 라이브러리를 이용해 구현하면 된다.

 

먼저 scoville 배열을 heap 구조로 만들어준 뒤 

가장 작은 값 2개를 pop 하여 섞은 음식의 스코빌 지수를 구해주었다. 

구한 스코빌 지수는 다시 heap에 넣어주고 넣을 때마다 횟수를 카운트해준다. 

 

이 과정에서 종료 조건을 생각해주면 되는데 두 가지 종료 조건 중 하나를 생각해내지 못해서 틀렸던 문제였다.

1. 가장 작은 수를 pop 했는데 K보다 크다면 이미 모든 스코빌 지수가 K보다 커졌다는 것이므로 횟수 출력 후 종료

2. 만약 스코빌 지수가 하나만 남고 (스코빌 배열의 길이 = 1) 그 지수가 K보다 작다면 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우이므로 -1 반환 후 종료 

1번 종료 조건은 쉽게 생각할 수 있었으나 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우를 생각해내지 못했는데 막상 답을 보고 나니 엄청 간단하게 생각하면 되는 문제였다. 


My Code

import heapq

def solution(scoville, K):
    answer = 0
    
    heapq.heapify(scoville)
    while scoville:
        first = heapq.heappop(scoville)
        if first >= K:
            return answer
        second = heapq.heappop(scoville)
        score = first + (second * 2)
        heapq.heappush(scoville, score)
        answer += 1
        if len(scoville) == 1 and scoville[0] < K:
            return -1

댓글