프로그래머스 Lv.2 더 맵게

서준·2023년 6월 23일
0

프로그래머스 Lv.2

목록 보기
1/1

1. 문제

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

2. 풀이

1차 시도(실패)

import heapq

def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    for i in range(len(scoville)):
        if len(scoville) == 1:
            answer = -1
            break
        if scoville[0] >= K:
            flag = 0
            break
        food1 = heapq.heappop(scoville)
        food2 = heapq.heappop(scoville)
        mix_food = food1 + (food2*2) 
        heapq.heappush(scoville, mix_food)
        answer += 1

    
    return answer
  • heap 사용해서 풀었으나.. 자꾸 2-3개 케이스에서만 오류가 뜬다.. 뭐가 문제인지 모르겠다..

2차 시도 (성공)

import heapq

def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    while len(scoville) >= 2:
        if scoville[0] >= K:
            break
        food1 = heapq.heappop(scoville)
        food2 = heapq.heappop(scoville)
        mix_food = food1 + (food2*2) 
        heapq.heappush(scoville, mix_food)
        answer += 1

    if len(scoville) == 1 and scoville[0] < K:
        answer = -1
    
    return answer
  • -1이 되는 경우의 수를 밖으로 빼주고, while문을 통해 list가 0으로 들어올 수 있을 만한 case를 분류해주었더니 성공했다!

3. Lv.up

  1. 힙 사용
import heapq
list = [1, 2, 3, 4, 5]
heapq.heapify(list)
  1. max heap 사용
import heapq
list = [1, 2, 3, 4, 5]
heap = [-num for num in list]
heap.heapify(heap)
max_val = -heapq.heappop(heap)

4. Ref.

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해도 되는구나.. 이걸보니 내가 해결해주지못한건 처음에list값에 아무것도 안들어왔을 때 이구나 라는 걸 알 수 있다.
profile
어린이입니다.

0개의 댓글