문제
https://programmers.co.kr/learn/courses/30/lessons/42626?language=python3
풀이
최소/최대 값을 계속 사용하는 알고리즘이다? –> Heap 자료구조.
파이썬 내장모듈 heapq를 통해 구현했다.
Heap 자료구조가 궁금하거나 직접 구현해야한다면
[자료구조] 힙(heap)이란 - Heee’s Development Blog를 참고하자.
import heapq
def solution(scoville, K):
heapq.heapify(scoville)
count = 0
while len(scoville) > 1 :
scov1 = heapq.heappop(scoville)
if scov1 >= K :
return count
scov2 = heapq.heappop(scoville)
heapq.heappush(scoville, scov1 + scov2*2)
count += 1
return -1
# 정확성 테스트
테스트 1 〉 통과 (0.01ms, 10.2MB)
테스트 2 〉 통과 (0.01ms, 10.1MB)
테스트 3 〉 통과 (0.98ms, 10.2MB)
테스트 4 〉 통과 (0.01ms, 10.2MB)
테스트 5 〉 통과 (0.01ms, 10.1MB)
테스트 6 〉 통과 (0.71ms, 10.2MB)
테스트 7 〉 통과 (0.60ms, 10.2MB)
테스트 8 〉 통과 (0.07ms, 10.2MB)
테스트 9 〉 통과 (0.06ms, 10.2MB)
테스트 10 〉 통과 (0.48ms, 10.2MB)
테스트 11 〉 통과 (0.30ms, 10.2MB)
테스트 12 〉 통과 (1.14ms, 10.3MB)
테스트 13 〉 통과 (0.59ms, 10.2MB)
테스트 14 〉 통과 (0.19ms, 10.2MB)
테스트 15 〉 통과 (0.76ms, 10.2MB)
테스트 16 〉 실패 (0.01ms, 10.2MB)
# 효율성 테스트
테스트 1 〉 통과 (171.57ms, 16.4MB)
테스트 2 〉 통과 (430.77ms, 22MB)
테스트 3 〉 통과 (2338.74ms, 49.9MB)
테스트 4 〉 통과 (141.67ms, 14.9MB)
테스트 5 〉 통과 (2442.48ms, 51.9MB)
엥?? 16번 테스트 케이스에 걸린다.
질문 게시판을 찾아본다.
작성자 : 백인길
scoville : [1,2,3] K : 11이 케이스를 통과한다면 16번 통과할듯합니다..
딱맞게 K 를 통과하는 음식이 하나로 만들어지는 경우를 따지는 테스트인듯하네요.
저도 이거 때매 조금 헤메였기때문에 올려봅니다..
백인길님 감사합니다.
전혀 고려하지 못했던 경우가 존재했다.
앞서 제출한 코드를 다시 살펴보자.
while len(scoville) > 1 :
만일 Heap에 남은 마지막 원소가 K 보다 크거나 같아지더라도
Heap의 원소개수 1에 걸려서 -1을 반환하고 있었다.
while 조건을 변경해서 제출해보자.
import heapq
def solution(scoville, K):
heapq.heapify(scoville)
count = 0
while scoville :
scov1 = heapq.heappop(scoville)
if scov1 >= K :
return count
if not scoville :
break
scov2 = heapq.heappop(scoville)
heapq.heappush(scoville, scov1 + scov2*2)
count += 1
return -1
# 정확성 테스트
테스트 1 〉 통과 (0.01ms, 10.2MB)
테스트 2 〉 통과 (0.01ms, 10.3MB)
테스트 3 〉 통과 (0.01ms, 10.2MB)
테스트 4 〉 통과 (0.01ms, 10.2MB)
테스트 5 〉 통과 (0.01ms, 10.3MB)
테스트 6 〉 통과 (0.67ms, 10.2MB)
테스트 7 〉 통과 (0.65ms, 10.2MB)
테스트 8 〉 통과 (0.07ms, 10.3MB)
테스트 9 〉 통과 (0.06ms, 10.2MB)
테스트 10 〉 통과 (0.44ms, 10.1MB)
테스트 11 〉 통과 (0.29ms, 10.2MB)
테스트 12 〉 통과 (1.03ms, 10.3MB)
테스트 13 〉 통과 (0.57ms, 10.2MB)
테스트 14 〉 통과 (0.02ms, 10.2MB)
테스트 15 〉 통과 (0.74ms, 10.2MB)
테스트 16 〉 통과 (0.01ms, 10.2MB)
# 효율성 테스트
테스트 1 〉 통과 (194.27ms, 16.3MB)
테스트 2 〉 통과 (351.77ms, 22MB)
테스트 3 〉 통과 (1691.82ms, 49.9MB)
테스트 4 〉 통과 (147.52ms, 15MB)
테스트 5 〉 통과 (1905.22ms, 51.8MB)
정확성, 효율성 모두 통과!
댓글남기기