[코테] 그리디 문제 - 무지의 먹방 라이브

·

1 min read

[코테] 그리디 문제 - 무지의 먹방 라이브

https://school.programmers.co.kr/learn/courses/30/lessons/42891

  • 효율성 테스트에 신경써야 하는 문제

  • 우선순위 큐를 활용해서 먹는 시간이 짧은 음식부터 큐에서 빼기

import heapq # 우선순위큐 활용: food_time이 짧은 음식부터 삭제

def solution(food_times, k):
    if sum(food_times) <= k:
        return -1

    food_num = len(food_times)

    q = [] 
    for i in range(food_num):
        # (음식 시간, 음식 번호) 형태로 삽입
        heapq.heappush(q, (food_times[i], i+1))

    previous = 0 # 이전에 제거한 음식의 food_time

    # 음식을 먹을 때 걸리는 시간 = (남은 음식 양) * (남은 음식 개수)
    # 남은 음식 양 = 현재 food_time - 이전 food_time

    while q:
        time = (q[0][0] - previous) * food_num
        if k >= time: # 음식이 남아 있는 경우
            k -= time
            previous, _ = heapq.heappop(q)
            food_num -= 1
        else: # 음식을 다 못먹고 시간이 끝난 경우 (남은 음식 중에 다음에 먹을 음식 찾기)
            idx = k % food_num
            q.sort(key=lambda x: x[1])
            answer = q[idx][1]
            break

    return answer