오늘은 프로그래머스의 더 맵게를 풀어보았다. 언어는 파이썬을 사용했습니다.
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
def solution(scoville, K):
answer = 0
#먼저 정렬
scoville = sorted(scoville)
first = scoville[0]
while first < K:
if len(scoville) == 1:
answer = -1
break
else:
new = first + scoville[1] * 2
del scoville[0:2]
scoville.append(new)
scoville = sorted(scoville)
first = scoville[0]
answer += 1
return answer
먼저 하찮은 나의 풀이다. 위 코드로하면 시간 복잡도가 O(N^2)이 된다. 정확성 테스트는 모두 통과하는데 효율성 테스트를 하나도 통과하지 못한다. 일단 알고리즘 자체는
1. scoville을 정렬
2. 제일 작은 요소가 K보다 작을 때
3. 요소가 1개밖에 없으면 스코빌 지수가 K를 넘는 음식을 만들 수 없으므로 -1을 리턴한다.
4. 아니라면 새로운 음식을 제조하고 scoville을 다시 재정렬한다.
위 과정을 반복하면 되지만 효율성 테스트를 통과할 수 없다. 따라서 사용하는 것이 힙이다.
import heapq
def solution(scoville, K):
# 힙 생성
heapq.heapify(scoville)
answer = 0
while True:
min1 = heapq.heappop(scoville)
if min1 >= K:
break
elif len(scoville) == 0:
answer = -1
break
min2 = heapq.heappop(scoville)
new = min1 + min2*2
heapq.heappush(scoville, new)
answer += 1
return answer
다른 풀이는 힙을 사용하는 것이다.(min heap)
heapq
라는 라이브러리를 import하면 사용 가능하다.
L 리스트로 min heap을 생성해준다.
L 리스트에서 가장 작은 값을 pop한다.
새로운 값을 L 리스트에 대소관계에 맞게 넣어준다.
아무튼
효율성 테스트를 모두 통과하는 것을 확인할 수 있다. heap을 사용한 풀이는 처음이었기에 좋은 경험을 할 수 있었다. 손에 익으려면 좀 더 반복적으로 사용해봐야할 것 같다.