본문 바로가기
파이썬 알고리즘 코딩

더맵게(프로그래머스 level 2)

by 볼록티 2020. 10. 26.
728x90
반응형
    • 더 맵게

 

문제 설명

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

입출력 예

scovilleKreturn

[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회입니다.

 

 

def solution(scoville, K):

    import heapq    

    answer = 0
    
    heap=[]
    
    for i in scoville:
        heapq.heappush(heap,i)
    
    while heap[0] <= K:

        try:
            heapq.heappush(heap, heapq.heappop(heap) + heapq.heappop(heap)*2)
            answer+=1
        except IndexError:
            return -1
    
    return answer

원래 효율성에서 광탈해서 검색으로 heapq 라는 함수를 알게 되었고, 계산복잡도가 기존의 정렬 알고리즘의 $n^{2}$ 에서 $log(n)$ 으로 확 줄어든다는 것을 알게 되었다. 

heap은 하나의 자료구조로써 정렬 알고리즘을 사용할 때 효율적인 함수이다.

heap 은 heappush는 heap 자료구조에 원소를 삽입해주는 것이고, heappop 은 최솟값을 pop 하는 함수이다. 

 

 

 원래 코드는 sorted() 함수를 사용해서 while 문을 돌 때마다 한번씩 했기 때문에 광탈할 수 밖에 없었다. 그래서 for 문으로 자기자신보다 크거나 같은 위치에 x[0] + x[1]*2 값을 삽입하곤 했는데, 그 역시도 광탈. 

 이를 계기로 heap 에 대한 공부를 해야겠다..

 

-  자료구조 속 값들이 불규칙적으로 변화할 때, 최솟값을 계속 뱉어주는 함수 heapq.heappop(인자: 객체)

- except 문 뒤에 'IndexError' 처럼 에러명을 명시해서 해당 에러에 대해서만 except 문을 시행하는 것을 습관들이자.

728x90
반응형

댓글