https://school.programmers.co.kr/learn/courses/30/lessons/176962#
가장 먼저 해야 할 것은 시간순으로 정렬을 해야 한다.
시간을 분으로 바꾸어 계산한다.
즉 12:20 -> 12:30을 계산하기 위해서 740 -> 750으로 바꾼다.
now(현재), future(그 다음 plan)을 2에서 만든 함수로 분으로 변경 후 gap을 구한다.
finish_time은 future plan과 now plan이 끝난 후 gap이다.
gap이 now plan의 소요시간보다 크다면 now plan은 끝을 낼 수 있다는 소리이다. 그러면 finish_time동안 쌓아두었던 job을 실행시킬 수 있다.
jobs은 잠시 멈춘 과제를 저장하는 스택이다. finish_time동안 jobs스택에 저장된 plan을 계산하는 코드이다.
만약, 과제를 끝낸 시각에 새로 시작해야 되는 과제와 잠시 멈춰둔 과제가 모두 있다면, 새로 시작해야 하는 과제부터 진행합니다. 라는 조건이 있다. 이것을 해결하기 위해서 다음과 같은 코드를 작성하였다.
job스택을 고려하지 않고 바로 다음 plan을 시작할 수 있다면
마지막으로 gap이 now plan의 소요시간보다 작을 때엔 now plan을 잠시 멈춰야 하므로 job스택에 append한다. 그리고 gap동안 작업을 했으므로 빼준다.
def solution(plans):
answer = []
jobs = []
plans = sorted(plans, key = lambda x: x[1])
def get_minute(time):
hour = int(time.split(":")[0])
minute = int(time.split(":")[1])
return hour*60+minute
idx = 0
now_time = get_minute(plans[0][1])
while plans:
if idx == len(plans)-1:
answer.append(plans[idx][0])
for i in range(len(jobs)):
answer.append(jobs.pop()[0])
break
now, future = plans[idx], plans[idx + 1]
gap = get_minute(future[1]) - get_minute(now[1])
finish_time = gap - int(now[2])
if int(now[2]) < gap:
answer.append(now[0])
plans.pop(idx)
for i in range(len(jobs)-1, -1, -1):
if jobs[i][2] <= finish_time:
finish_time = finish_time - jobs[i][2]
answer.append(jobs[i][0])
jobs.pop(i)
else:
jobs[i][2] = jobs[i][2] - finish_time
break
elif int(now[2]) == gap:
answer.append(now[0])
plans.pop(idx)
continue
else:
plans[idx][2] = int(plans[idx][2]) - gap
jobs.append(plans[idx])
idx = idx + 1
return answer