문제 설명
매운 것을 좋아하는 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 합니다.
입출력 예 설명
-
스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12] -
스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
가진 음식의 스코빌 지수 = [13, 9, 10, 12]
모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
풀이
import heapq #힙 선언
def solution(scoville, K):
heap = []
answer = 0
cnt = 0
for i in scoville:
heapq.heappush(heap,i) #힙에 푸쉬
while heap[0] <K: # 힙은 푸쉬 팝 할 때 마다 자동으로 정렬이 되므로 0번째 인덱스가 k보다 크면 모두 큼
try:
heapq.heappush(heap,heapq.heappop(heap)+heapq.heappop(heap)*2)
except IndexError: # 인덱스 에러는 모든 수가 k이상 증가할 수 없는것 이기에 return -1
return -1
cnt += 1
return cnt
import heapq
def solution(scoville, K):
answer = -1
cnt = 0
check_flag = False
heapscoville = heapq.heapify(scoville)
while scoville[0]<K:
min_first = heapq.heappop(scoville)
min_second = heapq.heappop(scoville)
heapq.heappush(scoville, min_first+(min_second*2))
if len(scoville) == 1 and scoville[0] <K:
check_flag = True
break
cnt += 1
if check_flag == False:
answer = cnt
return answer
느낀 점
처음에는 리스트 정렬로 풀려고 했다. 리스트 정렬로 풀다 보니 시간 초과가 자꾸 떠서 왜 그런지 생각을 해봤는데.. 값을 너무 많이 넣어서 매번 정렬할 때마다 시간이 걸리는 것이 아닐까?라는 생각을 하게 되었고, 다른 분들의 풀이를 참고하니 나와 같은 실패를 겪으신 분들이 많이 보였다. 그래서 다음으로 생각한 풀이 방법이 deque였는데 이 풀이 방법은 좀 더 구현을 해봐야겠다. 그다음 풀이 방법으로는 heapq를 이용한 풀이였는데 이 문제가 원하는 풀이답게 heapq를 통해서 푸는 것이 제일 좋아 보였다. heapq에 대해서 공부를 할 수 있는 좋은 경험이 되었고 이런 문제가 코딩 테스트에 나온다면 적어도 구현을 도전할 수는 있을 것 같다.
+해야 할 것 - deque를 이용한 풀이 추가.
'Algorithm' 카테고리의 다른 글
[이코테] 최단 경로 알고리즘 (0) | 2020.12.03 |
---|---|
[이코테] 자료구조 - 힙 (heap) (0) | 2020.12.03 |
[BOJ/백준] 1157번 단어 공부 (0) | 2020.11.30 |
[BOJ/백준] 10809번 알파벳 찾기 (0) | 2020.11.30 |
[BOJ/백준] 2579번 계단오르기 (0) | 2020.11.27 |