문제 설명
매운 것을 좋아하는 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
'프로그래머스 > 고득점 Kit' 카테고리의 다른 글
[프로그래머스] 체육복 - Python / 파이썬 (0) | 2023.02.16 |
---|---|
[프로그래머스] 최소직사각형 - Python / 파이썬 (0) | 2023.01.21 |
[프로그래머스] 완주하지 못한 선수 - Python / 파이썬 (1) | 2022.12.11 |
[프로그래머스] 가장 먼 노드 - Python / 파이썬 (0) | 2022.12.11 |
[프로그래머스] 입국심사 - Python / 파이썬 (0) | 2022.12.11 |
댓글