코테연습 - 힙(Heap) - 더 맵게

Doyeon Kim·2021년 12월 30일

코딩테스트 공부

목록 보기
5/171

더 맵게
문제 설명
: 매운 것을 좋아하는 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 합니다.
입출력 예
scoville K return
[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회입니다.


먼저 scoville 배열에 있는 수들을 오름차순으로 정렬하고
K이상이 될 때까지 작은 순서대로 섞고 answer에 1씩 저장한다.

(초기에 고뇌의 흔적..)



import heapq

def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)

    while scoville[0]<K:
        answer += 1
        if len(scoville)>1:
            heapq.heappush(scoville,heapq.heappop(scoville)+(heapq.heappop(scoville)*2))

        else :
            return -1

    return answer

+)Heap 이란
Heap 이란 자료구조 형태 중 하나로서 우선순위 큐를 위해 만들어진 구조이다.

(자세한 Heap에 대해 : https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html 참고)

코딩 테스트 문제 중 최솟값 , 혹은 최댓값을 계속해서 호출해야 하는 상황인 경우 Heap 구조를 이용하여 구현하면 시간측면에서 굉장히 효율적인 구현이 가능하다.

import heapq
heapq 모듈을 이용하여 힙 자료구조를 사용할 수 있다. heapq 는 내장 모듈이므로 따로 설치가 필요하지 않는다.

기본적으로 Min-priority-queue 구조를 가지고 있다.

import heapq

기존 배열을 Heap 구조로 - heapify()

testheap = [1,3,2,6,8,0,6]
heapq.heapify(testheap)
print(testheap)

print 결과값 => Heap 구조로 변했다.
[0, 3, 1, 6, 8, 2, 6]
Heap 에 요소 추가하기 - heappush(배열이름, 요소)

testheap = []
heapq.heappush(testheap, 3)
heapq.heappush(testheap, 5)
heapq.heappush(testheap, 1)
heapq.heappush(testheap, -3)
print(testheap)

#print 결과값 =>
[-3, 1, 3, 5]

Heap 요소를 삭제하기 - heappop(배열이름)

testheap = []
heapq.heappush(testheap, 3)
heapq.heappush(testheap, 5)
heapq.heappush(testheap, 1)
heapq.heappush(testheap, -3)
heapq.heappop(testheap)
heapq.heappop(testheap)
print(testheap)

print 결과값 =>
[3, 5]
힙 요소를 1개씩 삭제할 수 있다.

요소 2개가 삭제되었다. 삭제를 해도 자동으로 힙 구조는 유지된다!

출처: https://programming119.tistory.com/85 [개발자 아저씨들 힘을모아]

profile
성장하고 도전하는 개발자. 프로그래밍 좋아하세요?

0개의 댓글