문제 설명 및 제한사항
아이디어 및 해결 방법
코드
def solution(food_times, k):
if k >= sum(food_times):
return -1
food_times = [(t, i) for i, t in enumerate(food_times, 1)]
food_times.sort()
# 포인터 i를 관리합니다.
i = 0
# 남아있는 음식의 개수를 관리합니다.
remaining = len(food_times)
curr = 0
while k >= 0:
# 현재까지 가장 적게 남은 음식을 다 먹기 위해 "더 돌아야 하는"
# 사이클 수입니다.
ncycle = food_times[i][0] - curr
# 현재 food_time 값도 관리합니다.
curr = food_times[i][0]
if k == 0:
tmp = food_times[i:]
tmp.sort(key=lambda x: x[1])
return tmp[0][1]
# 남은 음식의 수 * 사이클 수 만큼 k를 소모합니다.
if k >= remaining * ncycle:
k -= remaining * ncycle
# 만약 남은 k를 가지고 사이클을 다 못 돌면,
# 1사이클 씩에 remaining개 돌고, r개가 남았을 때
# r번째 음식이 정답입니다.
else:
r = k % remaining
tmp = food_times[i:]
tmp.sort(key=lambda x: x[1])
return tmp[r][1]
# 다음으로 적게 남은 음식을 탐색합니다.
while i < len(food_times) and food_times[i][0] == curr:
i += 1
remaining -= 1
Python
복사
출처
프로그래머스 코딩테스트 연습 https://school.programmers.co.kr/learn/challenges