슬기로운 개발자생활/알고리즘노트
[그리디] 무지의 먹방 라이브
개발자 소신
2021. 1. 27. 16:43
반응형
1. 문제
무지의 카카오 TV 방송 !
1. 1번 음식부터 순서대로 먹기 시작함
2. 마지막 번호의 음식을 먹고나면 다시 1번 음식을 먹음
3. 1초에 한 음식만 먹고, 다음 음식은 남아있는 음식 중 가장 가까운 번호의 음식
4. 다음 번호의 음식이 오는데 걸리는 시간은 없음
K초가 지났다. 몇 번 음식을 먹어야 하는가?
2. 입력
# SET - 1
food_times=[3, 1, 2]
K = 5
# SET - 2
food_times = [4, 2, 3, 6, 7, 1, 5, 8]
K = 27
# SET - 3
food_times = [4, 2, 3, 6, 7, 1, 5, 8]
K = 16
3. 출력
# SET - 1
result = 1
# SET - 2
result = 5
# SET - 3
result = 3
4. 풀이
한 음식을 다 먹을때까지 걸리는 시간 = 남아있는 음식의 수 * (현재 음식을 먹는데 걸리는 시간 - 이전까지 먹은 시간)
우선순위 큐를 사용해 먹는데 가장 짧게 걸리는 음식부터 순서대로 비교한다.
K = 현재까지 음식을 먹고 남은시간
다음 음식을 먹는데 걸리는 시간을 계산하기위해,
previous에 이전에 다 먹은 음식 시간을 저장
그러면 현재 먹는 음식 - previous는 앞으로 먹는데 걸리는 시간의 기준이된다.
while K >= (q[0][0] - previous) * length
만약 while문 조건이 False일 때,
= K가 다음 음식을 다 먹는데 걸리는 시간보다 작으면, K를 length로 나눈 나머지가
(음식 번호 순서대로 정렬했을 때) 남아있는 음식에서 먹어야될 음식의 번호가 된다.
5. 코드
import heapq
def solution(food_times, K):
if sum(food_times) <= K:
return -1
q = []
for i in range(len(food_times)):
heapq.heappush(q, (food_times[i], i+1))
previous = 0
length = len(q)
while K >= (q[0][0] - previous) * length:
now, idx = heapq.heappop(q)
K -= (now-previous)*length
previous = now
length -= 1
q = sorted(q, key=lambda i : i[1])
return q[K%length][1]
반응형