Problem Solving/이것이 코딩테스트다

✅이코테 - 무지의 먹방 라이브 (그리디)

파피 2021. 6. 11. 17:49

#1. 문제 설계 및 풀이

그냥 for문 돌려서 배열을 업데이트하며 풀려고했지만 효율성 테스트를 보니 불가능했다.
그리디문제라서 어떻게하면 최선의 선택을 할 수 있을까 고민해봤지만 아이디어가 떠오르지 않았다.

#2. 배운 점 및 개선할 점

해설을 보니 음식 시간 배열에서 시간이 작은 순서대로 빼는 것이 이 문제의 핵심 아이디어였다.
또한, 더이상 음식을 제외할 수 없을때 나머지연산을 통해서 다음 먹어야할 음식을 찾아낼 수 있었다.

그리디 유형에 익숙해지는 연습을 더 해야할 것 같다... 🥲

 

import heapq

food_times = [3, 1 ,2]
k = 5

def solution(food_times, k) :
    total_time = 0
    previous = 0
    food_length = len(food_times)
    
    # 원소의 총 합이 k보다 작거나 같으면 k초뒤에 먹을 음식이 없으므로 -1 반환
    if sum(food_times) <= k :
        return -1
    
    # 시간이 작은 음식부터 먹어서 없애기 -> 우선순위 큐(최소힙) 사용
    q =[]
    for i in range(len(food_times)) :
        heapq.heappush(q, (food_times[i], i+1))
        
    # 큐에 음식이 없어질때까지 반복
    # k초 전에 현재 음식 하나를 다 먹을 수 있으면
    while total_time + food_length * (q[0][0]-previous) <= k :
        food_time= heapq.heappop(q)[0]
        
        total_time += food_length * (food_time-previous)
        
        food_length -= 1 # 먹은 음식 제외
        previous = food_time # 이전에 먹은 음식 시간
    
    # k초 전에 현재 음식 하나를 다 먹을 수 없으면
    # 음식을 시간순으로 정렬
    result = sorted(q, key=lambda x : x[1])
    return (result[(k-total_time) % food_length][1])

    
print(solution (food_times, k))