알고리즘

[프로그래머스] 더 맵게_Python level2(heap)

작은코딩 2022. 9. 3. 11:16

🔒 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

매운 것을 좋아하는 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
입출력 예 설명
  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회입니다.


🔓 풀이

🔑 문제 해결 / 코드

import heapq


def solution(scoville, K):
    answer = 0
    heap = scoville
    heapq.heapify(heap)

    if heap[0] >= K:
        return answer

    while len(heap) >= 2:
        item1 = heapq.heappop(heap)
        item2 = heapq.heappop(heap)
        heapq.heappush(heap, item1 + (item2 * 2))
        answer += 1
        if heap[0] >= K:
            return answer

    else:
        return -1




print(solution([1, 2, 3, 9, 10, 12], 7))
print(solution([1, 1, 100], 7))

🍀 Story

힙 자료구조를 공부하게 되어 알고리즘 문제를 풀어보았다. 최소 or 최댓값을 찾는 문제에서 효율적으로 사용이 가능할 거 같고 사용할 때 변화가 쉽게 예측이 되어 사용하기 편리했다.

복잡한 연산이라면 예측 난이도가 점점 상승하겠지만,,

 

문제 풀이 과정은 2개로 나뉘었다. 

1. 문제에서 제시한 방법의 구현

2. 예외처리

 

구현

heap 자료구조를 사용해서 가장 낮은 맵기를 가진 아이템을 뽑을 수 있었고 연산을 통해 두 아이템을 섞어 다시 heap에 넣어주었다. 

 

예외처리

구현은 비교적 쉽게 처리했는데 예외처리를 떠올리는데서 시간이 조금 소요되었다. 

 

먼저 while 반복문을 들어가기 전에 heap 자료구조의 최솟값이 K보다 크다면 이미 문제 조건을 충족했기에 0을 바로 리턴한다.

 

다음으로 반복문에 들어가게 되고 heap의 길이가 2보다 작아질때까지 반복한다. 

구현 과정을 수행한 뒤 answer을 1 증가시키고 heap의 최솟값이 K보다 크면 다음 반복문을 할 필요가 없기에 answer을 바로 리턴한다.

 

마지막으로 heap의 길이가 1이 될때까지 반복해도 결과가 나오지 않은 경우는 else문을 통해 -1을 반환한다.