코딩테스트
[파이썬(python)] 무지의 먹방 라이브
고후
2022. 2. 25. 12:35
처음엔 deque를 이용해 구현했다.
from collections import deque
def solution(food_times, k):
if sum(food_times) <= k:
return -1
queue = deque([0])
for i in range(k):
target = queue.popleft()
food_times[target] -= 1
#i번째에 먹을 음식 찾기
target = (target+1) % len(food_times)
for j in range(target, len(food_times)):
if food_times[j] > 0 :
queue.append(j)
break
return queue.popleft() + 1
그러나 효율성 제로..ㅜ 효율성이 o(n2)이라 그런것같다.
답지를 보면서 코드를 수정한 결과
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))
q.sort(key = lambda x:x[0])
length = len(food_times)
min_time = q[0][0] * length
cnt = 0
while cnt + min_time <= k:
food = heapq.heappop(q)
cnt += min_time
length -= 1
for i in range(length):
q[i][0] -= food[0]
min_time = q[0][0] * length
result = sorted(q, key = lambda x:x[1])
return result[(k - cnt) % length][1]
효율성 테스트에서 하나만 통과했다.
왜지 ??? 아마도 while문 안에서 for문을 다시 사용한 것이 문제인가보다. 그렇다면 for문을 삭제하는 방법을 생각해봐야한다
답지를 참고한 결과 어차피 음식의 순서만 중요할 뿐 음식의 다먹는 시간을 계속 변경해줄 필요가 없다.
따라서 직접 음식의 시간을 계속 변경해주는 것보다
뺄 음식을 정확히 구하고 시간을 정확히 카운트해주는 것이 효율성이 훨씬 좋다.
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])
q.sort(key = lambda x:x[0])
length = len(food_times)
min_time = q[0][0] * length
cnt = 0
while cnt + min_time <= k:
food = heapq.heappop(q)
cnt += min_time
length -= 1
min_time = (q[0][0] - food[0]) * length
result = sorted(q, key = lambda x:x[1])
return result[(k - cnt) % length][1]