[프로그래머스] 과제 진행하기

최동혁·2023년 4월 28일
0

1일 1코테 이상

목록 보기
1/10

풀이

문제에서 노골적으로 스택을 쓰라고 말하고 있다.
과제를 진행하다가 새로운 과제할 시간이 되면, 하던 과제는 잠시 제쳐두고 새로운 과제를 시작한다.
만약 시간이 남으면 아까 하다 남은 과제를 마저 진행하는데, 가장 최근에 그만두었던 과제를 해야한다.
이게 스택이다.
1. 2차원 배열에서 그 안에 있는 과제 시작 시간을 기준으로 정렬
2. 루프를 돌면서 차례대로 보며, 다음 시간 과제를 봐가며 현재 진행중인 과제를 끝낼 수 있는지, 없는지 판단
2.1 끝낼 수 없다면, 지금까지 한 시간을 과제하는데 필요한 총 시간에서 빼주고 스택에 집어넣기
2.2 끝낼 수 있다면, 끝낸 과제를 담는 배열에 집어넣고, 하다만 과제가 있는지 스택을 살펴보기
3. 다음 시간을 살펴보기 때문에 루프를 끝까지 돌리면 인덱스가 나가버리니깐 가장 마지막 배열은 시간 상관없이 과제를 끝낸 배열에 집어넣기
4. 루프를 전체 다 돌고나서 스택에 남아있는 과제들이 있다면 순서대로 pop 하면서 과제를 끝낸 배열에 집어넣어주기.

코드

def solution(plans):
    answer = []
    stk = []
    sorted_plans = sorted(plans, key=lambda x:(int(x[1].split(":")[0]), int(x[1].split(":")[1])))
    
    for plan_index in range(len(sorted_plans)):
        if plan_index < len(sorted_plans) - 1:
            next_plan_time = sorted_plans[plan_index + 1][1]
            next_hour, next_min = map(int, next_plan_time.split(":"))
            pre_hour, pre_min = map(int, sorted_plans[plan_index][1].split(":"))
            next_total_min = next_hour * 60 + next_min
            pre_total_min = pre_hour * 60 + pre_min
            sub = next_total_min - pre_total_min
            
            if sub >= int(sorted_plans[plan_index][2]):
                answer.append(sorted_plans[plan_index][0])
                pre = pre_total_min + int(sorted_plans[plan_index][2])
                while stk:
                    homework, rest_time = stk.pop()
                    if next_total_min >= pre + rest_time:
                        answer.append(homework)
                        pre += rest_time
                    else:
                        stk.append((homework, rest_time - (next_total_min - pre)))
                        pre += next_total_min - pre
                        break
            else:
                stk.append((sorted_plans[plan_index][0], int(sorted_plans[plan_index][2]) - sub))
        else:
            answer.append(sorted_plans[-1][0])
            
    while stk:
        answer.append(stk.pop()[0])
    
    return answer

profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글