코린이의 공부일기

[Python] 프로그래머스 LEVEL2 > 더 맵게 (heap 이용) 본문

STUDY/[Python] Coding Test

[Python] 프로그래머스 LEVEL2 > 더 맵게 (heap 이용)

SOJUNG 2021. 7. 3. 18:11

안녕하세요 ! 오늘은 오랜만에 프로그래머스 레벨2 문제인 '더 맵게'를 가져왔습니다.

이번 문제는 heap(힙)을 사용하여 푸는 문제로 처음에는 ,, ! 힙을 사용하지 않고 for문을 사용했다가 시간효율성에서 다 실패로 나왔습니다.

그래서 이 문제의 목적을 생각하며 heap(힙)을 사용해 푸니 효율성 통과가 나왔습니다.

프로그래머스에서 많은 문제를 풀어보며 배워가는 점은 많은 함수들과 코딩설계 뿐 아니라 시간복잡도를 줄이려고 하는 능력도 같이 배워가는 거 같습니다. 

실제로 코딩테스트를 볼 때 이 부분도 정말정말 중요하니 효율성 체크도 같이하면서 테스트를 보는 것을 추천드립니다. 

 

 

 

문제 설명

 

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

 

 

문제 풀이

이 문제는 heap을 사용하여 푸는 문제로 만약 heap을 사용하지 않고 for문 또는 while문과 sort을 사용해 푼다면 거의 시간 초과로 뜰 것입니다. 

특히 sort는 시간 복잡도가 좋지 않은 편이기에 쓰지 않는것을 추천드립니다.

저도 이거 처음 풀 때 heap을 모르는 상태여서 for문과 sort을 사용했더니 다 시간초과라고 떴답니다.

문제 자체는 어렵지 않지만 시간복잡도를 고려해야하는 문제로 heap을 공부했다면 꼭 풀기 권장합니다.

 

import heapq
def solution(scoville, K):
    mix=0
    heapq.heapify(scoville)
    if scoville[0]==K:
        return 0
    while len(scoville)>=2:
        T=heapq.heappop(scoville)+(heapq.heappop(scoville)*2) # #제일 낮은 값
        heapq.heappush(scoville,T)
        mix+=1
        if scoville[0]>=K:
            return mix
        
    return -1

코드에서 heap을 쓸 때 꼭 까먹어야하지 말아야할 점! 이 부분을 까먹고 안써서 틀린 분들도 굉장히 많았습니다

heapq.heapify()를 사용해 리스트를 힙(heap)으로 선언해주고 heappop을 해야 최솟값이 나온답니다.

문제 자체는 어렵지 않아 scoville에서의 최솟값이K보다 커질 때까지 두 최솟값을 더해주며 scoville에 push해주는 방식으로 , heap을 써봤다면 금방 풀 수 있는 문제였습니다.

 

 

포스팅은 여기까지입니당:)

읽어주셔서 감사합니당 !

잘못된 부분 지적은 환영입니다 ♡

 

 

 

 

 

Comments