Search

과제 진행하기

입출력 예시

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을 계산해서 사용할 수 있었다.