문제
https://programmers.co.kr/learn/courses/30/lessons/42891
풀이
K보다 커지게 되면 남은 시간의 개수로 나누지 않고 그때부터 while문을 돌다가 오버된 시간의 인덱스에서 반환하도록 했다.
근데 이렇게 했더니 몇몇 효율성 테스트에서 시간초과가 발생했다.
def find_order(time, sec, over): #기준 시간과 K를 넘긴 값을 받는다.
for i in range(len(time)): #기준 시간보다 큰 값, 즉 다 소비되지 않은 음식만 남긴다.
time[i] -= sec
i = len(time)
while(over > 0): #마지막인덱스부터 거꾸로 돌며 정확히 k초 일 때 반환한다.
i -= 1
if i < 0:
i = len(time)-1
if time[i] > 0:
over -= 1
return i
''' #while문으로 바꾸기 전 코드
for i in range(len(time)-1, -1, -1):
if time[i] > 0:
over -= 1
if over <= 0:
return i
if i == 0:
i = len(time)-1
#over가 0이 아닌데, 포문을 탈출한 경우 런타임 에러가 발생했었다. 포문의 인덱스 조작이 불가능한건가 싶다.
'''
def solution(food_times, k):
foods = dict(enumerate(food_times))
foods = sorted(foods.items(), key=lambda x : x[1]) #초와 순서를 묶어 정렬한다.ex)[(1,1),(2,2),(0,3)] 근데 그럴 필요 없었음
last_sec = 0
left_foods = len(food_times)
for order, sec in foods:
k -= (sec-last_sec) * (left_foods)
left_foods -= 1
if k < 0: #만약 k초를 넘겨 계산했을 때
return find_order(food_times, last_sec, abs(k)) + 1
last_sec = sec
위의 코드는 효율성 테스트와 테스트케이스 16, 19, 20, 23번을 통과하지 못한 코드
그래서 sec를 찾은 후 오버된 시간만큼 반복문을 도는 대신,
오버되기 직전, 남은 시간을 인자로 넘겨 나머지 연산자와 인덱스로 답을 반환했다.
def find_order(time, sec, left_time):
left_food = []
for i in range(len(time)):
time[i] -= sec
if time[i] > 0:
left_food.append(i) #음식이 남은 접시의 원래 순서를 저장
return left_food[left_time%len(left_food)] #남은 음식수로 나누고 그 순서를 반환
def solution(food_times, k):
foods = sorted(food_times)
last_sec = 0
left_foods = len(food_times)
for sec in foods:
k -= (sec-last_sec) * (left_foods)
if k < 0:
return find_order(food_times, last_sec, k + (sec-last_sec) * (left_foods)) + 1
left_foods -= 1
last_sec = sec
return -1 #음식을 다 소비할때까지 오류가 발생하지 않았을 때 return -1
정확도 실패는 return -1때문이었다.
통과했다.
다른사람의 코드
볼 기력이 없다..
나중에 시간되면 추가해야지