plans 수 최대 1000개.. 그냥 단순 구현
- 진행하다가 멈추는 과제는 ing에 담고, 끝난 과제는 fin에 담아서 기록
- 현재 시간은 time_change를 통해 int값으로 정의
- 현재시간 + 걸리는 시간과 다음 과제 시작 시간을 비교하면서 fin,ing비교
- 만약 과제를 끝낸 현재시간과 다음 과제 시작 시간 간에 간격이 발생할 경우 ing.pop을 통해 하다만 과제를 다시 진행 (ing에는 [과목,남은시간]형태로 append해서 기록) 이 때 남은 시간을 update하며 저장했다.
단순하지만 구현에 있어서 시간이 오래 걸린 문제.
def time_change(l): # 시간 표현 바꾸는 함수
for idx,(sub,start,time) in enumerate(l):
a,b = list(map(int,start.split(':')))
l[idx][1] = 60*a + b
return sorted(l, key=lambda x: x[1]) # 시작 순서대로 배열
def solution(plans):
ing = [] # 진행 중인 과제
fin = [] # 마무리한 과제
plans = time_change(plans)
now = plans[0][1] # 현재 시간은 맨 첫번째 과제 시작시간
for idx,plan in enumerate(plans[:-1]): # idxError피하려고 마지막 항은 포함 x
sub = plan[0]
start = plan[1]
time = plan[2]
if now + int(time) <= plans[idx+1][1]: # 다음 과목 시작 시간과 비교해서 더 작으면
fin.append(sub) # 과제 끝내서 fin에 append
now = now + int(time) # 지금 시간 update
last = plans[idx+1][1]-now # 다음과제 시작 시간까지 남은시간
while last != 0 and ing: # 남은 시간동안 ing의 과제 진행
ing_sub, last_time = ing.pop()
if last_time <= last: # 남은 시간 동안 과제 마무리할 수 있으면
last = last - last_time # 남은시간에서 과제 진행한 시간 빼주고
fin.append(ing_sub) # 마무리한 과제 fin에 append
else: # 남은 시간동안 과제 못 끝내면
ing.append([ing_sub,last_time-last]) # ing의 과제 남은 시간 update
last = 0
now = plans[idx+1][1] # 다음 과제 시작
else: # 다음 과제 시작시간인데 지금 과제 못 끝냈으면
ing.append([sub, start+int(time) - plans[idx+1][1]]) # ing에 [과목명,남은시간] append
now = plans[idx+1][1] # 다음 과제 시작
sub = plans[-1][0]
fin.append(sub) # 마지막 과제 일단 끝내고
for i in ing[::-1]: # ing의 과제 차례로 끝냄
fin.append(i[0])
return fin