[프로그래머스] 더 맵게

별생하마·2021년 7월 30일
0

알고리즘 공부하마

목록 보기
5/13


오늘은 프로그래머스의 더 맵게를 풀어보았다. 언어는 파이썬을 사용했습니다.

1. 문제 설명

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

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

1-1. 제한 사항

  • scoville의 길이는 1 이상 1,000,000 이하입니다.
  • K는 0 이상 1,000,000,000 이하입니다.
  • scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.

2. 나의 풀이

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을 다시 재정렬한다.
위 과정을 반복하면 되지만 효율성 테스트를 통과할 수 없다. 따라서 사용하는 것이 힙이다.

3. 다른 풀이

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하면 사용 가능하다.

heapq.heapify(L)

L 리스트로 min heap을 생성해준다.

heapq.heappop(L)

L 리스트에서 가장 작은 값을 pop한다.

heapq.heappush(L, new)

새로운 값을 L 리스트에 대소관계에 맞게 넣어준다.

아무튼
효율성 테스트를 모두 통과하는 것을 확인할 수 있다. heap을 사용한 풀이는 처음이었기에 좋은 경험을 할 수 있었다. 손에 익으려면 좀 더 반복적으로 사용해봐야할 것 같다.

profile
데이터를 분석하마!

0개의 댓글