[Python] 더 맵게

허창원·2023년 5월 19일
0
post-thumbnail
post-custom-banner

문제 설명

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 *2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • scovile의 길이는 2이상 1,000,000 이하입니다.
  • K는 0 이상 1,000,000,000 이하입니다.
  • scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.

입출력 예

입출력 예 설명

  • 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 1 + (2*2) = 5
    가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12]
  • 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 3 + (5*2) = 13
    가진 음식의 스코빌 지수 = [13,9,10,12]
    모든 음식의 스코빌 지수가 7 이상 되었고 이때 섞은 횟수는 2회입니다.

문제 풀이

import heapq
def solution(scoville, K):
   answer = 0
   result = []
   for value in scoville:
       heapq.heappush(result, value)
   
   while result[0] < K:
       if len(result) < 2:
           return -1
       answer += 1
       add_scovile = heapq.heappop(result) + heapq.heappop(result) * 2
       heapq.heappush(result,add_scovile)
   return answer

heapq 라이브러리를 사용하여 풀었다. 힙 라이브러리의 시간복잡도는 logN으로 리스트의 시간복잡도 N보다 낮기 때문에 사용하였다.
scoville 리스트를 힙으로 오름차순 정렬한 후, heapq.heappop()은 가장 작은 원소인 첫 번째 원소와 첫 번째 원소가 빠지면서 그다음 가장 작은 원소인 두 번째 원소를 빼내어 섞은 음식의 스코빌 지수를 계산해 준 후 다시 힙 리스트에 heapq.heappush()로 원소를 추가해주었다.
이때, 추가하면 자동으로 오름차순으로 정렬된다. 이를 활용해 while문으로 result 리스트의 가장 작은 원소가 K보다 같거나 클 때까지 반복한다.
만약 result의 첫 번째 원소가 K 이상에 도달하지 못하고 result의 원소 수가 2개 미만인 경우 -1을 return 해주었다.

post-custom-banner

0개의 댓글