Programmers Coding-Test

[Python] 힙 : 더 맵게

으녜 2022. 5. 9. 18:40
728x90

https://programmers.co.kr/learn/courses/30/lessons/42626

 

코딩테스트 연습 - 더 맵게

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같

programmers.co.kr

 

 

💡 문제


매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

 

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 합니다.

 

#1

1) 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 된다.

새로운 음식의 스코빌 지수 = 1 + (2*2) = 5

가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12]

 

2) 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 된다.

새로운 음식의 스코빌 지수 = 3 + (5*2) = 13

가진 음식의 스코빌 지수 = [13,9,10,12]

 

모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.

 

 

 

[Python Code 👩🏻‍💻]

import heapq

def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while True:
        min1 = heapq.heappop(scoville)
        if min1 >=K:
            break
        elif len(scoville) ==0:
            answer = -1
            break
        min2 = heapq.heappop(scoville)
        new_scoville = min1 + 2*min2
        heapq.heappush(scoville,new_scoville)
        answer +=1
    return answer

[Code Review]

1. heapq 라이브러리를 이용하여 scoville 지수를 기준으로 min-heap(최소힙)을 생성한다.

2. 최소힙 내 가장 작은 원소(=루트)를 꺼낸 후 이 숫자가 K보다 작을 경우 while문을 중단한다.

3. 그렇지 않고, 스코빌 내 원소가 없다면 (=지수를 K 이상으로 만들 수 없다면) answer에 -1을 저장한 후 while문을 중단한다.

4. 최소힙 내 두 번째로 작은 원소를 꺼내 새로운 스코빌 지수를 계산한다.

5. 계산된 스코빌 지수를 heap에 넣어 새로운 최소힙을 만든다.

6. 한 번 수행될 때마다 answer +1을 한다.

 

728x90