반응형
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인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12]
- 스코빌 지수가 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
728x90
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
문자열 압축, Python3 [프로그래머스] (0) | 2021.03.18 |
---|---|
소수 찾기-lv2, Python3 [프로그래머스] (0) | 2021.03.17 |
가장 큰 수, Python3 원리 [프로그래머스] (0) | 2021.03.16 |
다리를 지나는 트럭, Python3 [프로그래머스] (0) | 2021.03.15 |
프린터, Python3 [프로그래머스] (0) | 2021.03.15 |