알고리즘 풀이/프로그래머스

[Level 2] 더 맵게

mhko411 2021. 2. 21. 23:30
728x90

programmers.co.kr/learn/courses/30/lessons/42626

 

코딩테스트 연습 - 더 맵게

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같

programmers.co.kr

문제요약

모든 음식을 스코빌지수 K이상으로 만들기 위해서 스코빌지수가 제일 낮은 음식과 두 번째로 낮은 음식을 일정한 규칙응로 섞는다. 모든 음식의 스코빌지수가 K이상이기 위해서는 몇 번을 섞어야 하는지 구하라

단 모든 음식을 K이상으로 만들지 못할 때는 -1을 출력한다.


접근

힙으로 분류가 되었기 때문에 Python의 heapq 모듈을 사용해보았다.

힙에 넣게 되면 계속해서 오름차순으로 정렬되기 때문에 첫 번째와 두 번째 데이터를 꺼내서 계속 섞어주며

예외처리를 해줘야 하낟.

 

구현

heap을 사용할 때는 데이터를 넣을 때 heapq.heappush(list, data)를 사용한다. 괄호 안에 힙을 나타내는 리스트를 넣고 두 번째 인자에 힙에 넣을 데이터를 전달한다.

그렇게 되면 heap 리스트의 데이터들이 오름차순으로 정렬된다.

 

또한 예외처리를 신경써줘야한다.

-1을 return하는 상황은 더 이상 섞어도 K이상으로 만들 수 없을 때이다

그러한 상황은 원소가 하나 남았을 때 K미만일 때, 제일 작은 원소를 꺼냈는데 더 이상 힙에 원소가 없을 때이다.

따라서 이러한 경우에는 바로 -1을 return하도록 하였다.

import heapq
def solution(scoville, K):
    answer = 0
    heap = []
    for idx in range(len(scoville)):
        heapq.heappush(heap, scoville[idx])
    
    while True:
        # 첫 번째 원소가 K이상이면 뒤의 원소도 K이상이기 때문에 바로 종료
        if heap[0] >= K:
            break
        # 현재 힙에 원소가 1개 있는데 그것이 K보다 작다면 -1 return
        if len(heap) == 1 and heap[0] < K:
            return -1
        # 제일 작은 원소를 꺼낸다.
        a = heapq.heappop(heap)
        # 힙에 원소가 남아있다면 두 번째 음식을 꺼내서 섞어줌
        if heap:
            b = heapq.heappop(heap)
            c = a + (b*2)
            heapq.heappush(heap, c)
        # 힙에 원소가 남아있지 않다면 -1을 return    
        else:
            return -1
        answer += 1
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 땅따먹기  (0) 2021.02.22
[Level 2] 올바른 괄호  (0) 2021.02.21
[Level 2] 가장 큰 수  (0) 2021.02.20
[Level 2] 구명보트  (0) 2021.02.20
[Level 2] 전화번호 목록  (0) 2021.02.19