문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42891
코딩테스트 연습 - 무지의 먹방 라이브
programmers.co.kr
Test Case
문제 풀이
처음에 그냥 무지성으로 반복문 돌려가면서 음식 하나씩 먹다가 정답을 구하는식으로 풀었다가 효율성에서 걸렸다. 이코테 책에서 난이도 1이라고 하길래 쉽게 풀리나 했는데 역시나 틀렸다.
문제풀이는 우선순위큐를 사용해서 정렬 한 뒤 각 음식마다 남은 양을 하나씩 먹어치우는게 아니라 한 cycle씩 먹어서 최대한 빨리 답을 도출하는 것이다. 여기서 말하는 cycle 은 while문의 조건인데, 남은 음식들을 하나씩 다 먹는 것, 그러니까 첫번째 음식 부터 마지막 음식까지 먹게되는 시간을 의미하고 그 cycle이 문제에 주어진 네트워크가 끊기는 시간보다 적을 동안 반복한다.
그 다음 남은 시간은 한 cycle보다 작은 시간들이므로 k에서 음식 먹은 시간 합을 빼서 남은 음식들 개수로 나눠 준 값이 답이 된다.
그림으로 표현하면 쉬운데 말로 표현하려다보니 조금 어려운 문제인듯 하다.
Source Code
import heapq
import sys
input = sys.stdin.readline
def solution(food_times, k):
if sum(food_times) <= k:
return -1
length = len(food_times)
q = [] # 음식시간, 음식번호 순
for i in range(length):
heapq.heappush(q, (food_times[i],i+1))
sum_time, prev_time = 0, 0
# sum_time : 여태까지 먹은 음식 시간 합
# prev_time : 이전에 먹은 음식 시간
while sum_time + ((q[0][0] - prev_time) * length) <= k:
now_time = heapq.heappop(q)[0]
sum_time += (now_time - prev_time) * length
prev_time = now_time
length -= 1
# 우선순위큐 -> 음식번호순
result = sorted(q, key = lambda x:x[1])
return result[(k - sum_time) % length][1]
food_times = list(map(int, input().split()))
k = int(input())
print(solution(food_times,k))
'Develop > algorithm' 카테고리의 다른 글
이것이 코딩테스트다 3 문자열 뒤집기 (0) | 2021.12.08 |
---|---|
이것이 코딩테스트다 2 곱하기 혹은 더하기 (0) | 2021.12.08 |
이것이 코딩테스트다 1 모험가 길드 (0) | 2021.11.22 |
이것이 코딩테스트다 40 숨바꼭질 (Python) (0) | 2021.09.05 |
이것이 코딩테스트다 39 화성 탐사 (Python) (0) | 2021.09.03 |