[Programmers] Q176962 과제 진행하기

Question

Language: python

시간 단위로 스케쥴링을 수행하여, 과제의 실행 순서를 구하는 문제로, CPU Scheduling을 구현하는 형태의 문제이다.

과제 시작 시간, 처리 시간을 활용하여 다음 과제가 실행되기 전까지 실행이 되는 경우면 해당 과제를 처리하고, 그렇지 않은 경우 과제를 멈추고 새로운 과제를 실행해야한다.

해당 문제의 주의점은 여유 시간(다음 과제 시작 시간 - 현재 과제 시작 시간)을 통해 현재 과제를 온전히 다 처리할 수 있는지 여부를 파악해서 관리하는 것이 중요하다.

Solution

def convert_to_min(h):
    hour,min=map(int,h.split(":"))
    return hour * 60 + min

def solution(plans):
    answer = []

    #멈춘 과제
    paused_tasks=[]

    #시간을 수로 표기
    plans=sorted(map(lambda x: [x[0],convert_to_min(x[1]),int(x[2])],plans),key=lambda x: x[1])

    #처음에 실행되는 과제
    task_name,current_time,task_play_time=plans.pop(0)

    while plans:
        #다음 과제 시작하기 전에 현재 진행중인 과제를 끝낼 수 있는 경우
        if current_time + task_play_time <= plans[0][1]:
            current_time+=task_play_time
            task_play_time=0
            answer.append(task_name)

            #멈췄던 과제에 대한 처리
            while paused_tasks:
                task_name,task_play_time=paused_tasks.pop()
                end_time=current_time + task_play_time

                #과제를 끝낼 수 없는 경우
                if end_time > plans[0][1]:
                    break
                task_play_time=0
                current_time=end_time
                answer.append(task_name)
    
        task_play_time-=(plans[0][1]-current_time)

        #현재 과제를 멈춰두고
        if task_play_time > 0:
            paused_tasks.append((task_name,task_play_time)) 

        #다음에 처리해야될 과제 실행
        task_name,current_time,task_play_time=plans.pop(0)

    #마지막으로 실행중이던 과제 처리
    answer.append(task_name)

    #멈춰뒀던 과제들 실행
    while paused_tasks:
        task_name, task_play_time=paused_tasks.pop()
        answer.append(task_name)

    return answer

댓글남기기