입출력 예시
plans | result |
[["korean", "11:40", "30"], ["english", "12:10", "20"], ["math", "12:30", "40"]] | ["korean", "english", "math"] |
[["science", "12:40", "50"], ["music", "12:20", "40"], ["history", "14:00", "30"], ["computer", "12:30", "100"]] | ["science", "history", "computer", "music"] |
[["aaa", "12:00", "20"], ["bbb", "12:10", "30"], ["ccc", "12:40", "10"]] | ["bbb", "ccc", "aaa"] |
나의 코드
def solution(plans):
for item in plans: # turn time into integer for comparison
hr, mn = map(int, item[1].split(':')) # start time (hr, min)
pt = int(item[2]) # playtime
item[1] = hr*60+mn
item[2] = pt
plans.sort(key=lambda x: x[1]) # sort plans by start time
done = []
not_done = [] # use as stack
for i in range(len(plans)-1):
end = plans[i][1] + plans[i][2] # end time
if end > plans[i+1][1]: # if this will not end until next one
not_done.append([plans[i][0], end-plans[i+1][1]]) # append to unfinished work by [name, remaining_time]
else:
done.append(plans[i][0]) # finished
free_time = plans[i+1][1] - end # free time until next one
while free_time > 0: # do unfinished works during free time
if not_done: # if unfinished work exists
not_done[-1][1] -= free_time
if not_done[-1][1] <= 0: # done
free_time = -1 * not_done[-1][1] # remaining free time
done.append(not_done.pop()[0]) # finished
else: # not finished, but no more free time
free_time = 0
else: # if there are no unfinished works
break
not_done.append([plans[-1][0], plans[-1][2]]) # append last one
while not_done: # infitine free time
done.append(not_done.pop()[0])
return done
Python
복사
다른 풀이
# by 김남준
def solution(plans):
plans = sorted(map(lambda x: [x[0], int(x[1][:2]) * 60 + int(x[1][3:]), int(x[2])], plans), key=lambda x: -x[1]) # start time 기준으로 역순 ordering
lst = [] # [final endtime, name] 형식으로 사용할 list
while plans:
x = plans.pop() # 마지막부터 pop
for i, v in enumerate(lst):
if v[0] > x[1]: # A.endtime > B.start 이면 (이전 과제가 안 끝났으면)
lst[i][0] += x[2] # A.endtime += B.playtime (다음 과제 playtime만큼 endtime 늘리기)!!
lst.append([x[1] + x[2], x[0]]) # [endtime, name] 형식으로 append
lst.sort() # endtime 기준으로 정렬
return list(map(lambda x: x[1], lst))
Python
복사
개선점 분석
•
Naïve하게 stack으로 생각하다보니 while과 if 문이 너무 많아졌다.
•
다른 풀이를 참고해보니, stack을 굳이 쓰지 않고도 아직 안 끝난 과제는 다음 과제 하는데 걸리는 시간만큼 더해주면 되는 간단한 방법으로 최종 end time을 계산해서 사용할 수 있었다.