728x90
반응형
무지의 먹방 라이브
난이도 : 下 풀이 시간 : 30분
시간 제한 : 1초 메모리 제한 : 128 MB
해답
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))
used = 0
previous = 0
remain = len(food_times)
while (used + ((q[0][0] - previous) * remain) <= k):
now = heapq.heappop(q)[0]
used = used + (now - previous) * remain
remain = remain - 1
previous = now
answer = sorted(q, key=lambda x: x[1])
return answer[(k - used) % remain][1]
예시
import heapq
def solution(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))
sum_value = 0 # 먹기 위해 사용한 시간
previous = 0 # 직전에 다 먹은 음식 시간
length = len(food_times) # 남은 음식의 개수
# sum_value + (현재의 음식 시간 - 이전 음식 시간) * 현재 음식 개수와 k 비교
while sum_value + ((q[0][0] - previous) * length) <= k:
now = heapq.heappop(q)[0]
sum_value += (now - previous) * length
length -= 1 # 다 먹은 음식 제외
previous = now # 이전 음식 시간 재설정
# 남은 음식 중에서 몇 번째 음식인지 확인하여 출력
result = sorted(q, key=lambda x: x[1]) # 음식의 번호 기준으로 정렬
return result[(k - sum_value) % length][1]
해설
우선순위 큐 알고리즘을 사용하여 푸는 문제였습니다. 처음에 리스트를 사용하여 풀었는데 효율성 문제 때문에 우선순위 큐를 사용하는 것이 좋아보입니다. 리스트의 시간 복잡도는 O(N), 우선순위 큐의 시간 복잡도는 O(logN)
728x90
반응형
'알고리즘 (Python) > 이것이 코딩 테스트다 with 파이썬' 카테고리의 다른 글
[구현 알고리즘] 문자열 재정렬 - 파이썬(python) (0) | 2021.12.15 |
---|---|
[구현 알고리즘] 럭키 스트레이트 - 파이썬(python) (0) | 2021.12.15 |
[그리디 알고리즘] 볼링공 고르기 - 파이썬(python) (0) | 2021.08.09 |
[그리디 알고리즘] 만들 수 없는 금액 - 파이썬(python) (0) | 2021.08.04 |
[그리디 알고리즘] 문자열 뒤집기 - 파이썬(python) (0) | 2021.08.04 |