문제풀이(Problem Solving)

더 맵게, Python3 시간초과,원리 [프로그래머스]

게임이 더 좋아 2021. 3. 16. 22:27
반응형
728x170

문제 설명

매운 것을 좋아하는 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):
    lst = sorted(scoville)
    cnt = 0
    while(lst[0] < K): #최솟값 체크 굳이 해야하는가?
        lst[0] = lst[1]*2 + lst.pop(0) #정렬이 되어있다는 가정 하에 굿
        cnt += 1
        if(len(lst) == 1): #1일 때
            if lst[0] < K:
                return -1
            else:
                return cnt
        #정렬을 해야하는데 sort는 오래걸리니 for로 되는 곳 까지만 돌리고 멈추자.
        cur = lst.pop(0) # 우리가 정렬해야하는 대상
        if cur >= lst[-1]:
            lst.append(cur)
        else:
            for i in range(len(lst)):
                if cur <= lst[i]:
                    lst.insert(i,cur)
                    break
    return cnt

#아니 이렇게하면 시간초과나네 ㅁㅇ나ㅜㄹㅇ님룽ㄴ밀ㄴㅇ

 

굳이 최소인 수를 찾기 위해 sort를 안해도 되는 방법이 있었으니

바로 heap을 이용하는 방법이다.

 

아오.. 항상 오름차순 정렬을 원할 때는 heapq를 생각해보자

 

 

import heapq
#힙의 특성은 가장 작은 요소가 항상 루트인 heap[0]이라는 점

def solution(scoville, K):
    lst = list()
    cnt = 0
    for i in scoville:
        heapq.heappush(lst,i)# lst에 s를 넣음. heap형식으로
    
    while(lst[0]<K):
        if len(lst) > 1: # 2개 이상 있어야 조합을 할 수 있음
            a = heapq.heappop(lst) #최소
            b = heapq.heappop(lst) #두번째 작은값(두번째로 pop했으니까)
            #사실 heappop()은 최솟값을 뱉겠지?
            
            c = a+2*b #새로운 값
            heapq.heappush(lst,c) # 다시 힙에 집어넣음
            cnt += 1 # 조합했으니 +
            
        else: #1개밖에 없는데 아직도 K보다 작다?
            return -1
    
    #최솟값이 K보다 크거나 같다? 이제 할 필요 없음.
    return cnt 

 

 

 

 


 

참고링크

 

python.flowdas.com/library/heapq.html

 

반응형
그리드형