과제 진행하기

홍범선·2023년 4월 3일
0

프로그래머스

목록 보기
1/18

과제 진행하기

https://school.programmers.co.kr/learn/courses/30/lessons/176962#

문제

풀이

  1. 가장 먼저 해야 할 것은 시간순으로 정렬을 해야 한다.

  2. 시간을 분으로 바꾸어 계산한다.
    즉 12:20 -> 12:30을 계산하기 위해서 740 -> 750으로 바꾼다.

  3. now(현재), future(그 다음 plan)을 2에서 만든 함수로 분으로 변경 후 gap을 구한다.

    finish_time은 future plan과 now plan이 끝난 후 gap이다.

  4. gap이 now plan의 소요시간보다 크다면 now plan은 끝을 낼 수 있다는 소리이다. 그러면 finish_time동안 쌓아두었던 job을 실행시킬 수 있다.

    jobs은 잠시 멈춘 과제를 저장하는 스택이다. finish_time동안 jobs스택에 저장된 plan을 계산하는 코드이다.

  5. 만약, 과제를 끝낸 시각에 새로 시작해야 되는 과제와 잠시 멈춰둔 과제가 모두 있다면, 새로 시작해야 하는 과제부터 진행합니다. 라는 조건이 있다. 이것을 해결하기 위해서 다음과 같은 코드를 작성하였다.

    job스택을 고려하지 않고 바로 다음 plan을 시작할 수 있다면

  6. 마지막으로 gap이 now plan의 소요시간보다 작을 때엔 now plan을 잠시 멈춰야 하므로 job스택에 append한다. 그리고 gap동안 작업을 했으므로 빼준다.

def solution(plans):
    answer = []
    jobs = []
    plans = sorted(plans, key = lambda x: x[1])
    
    def get_minute(time):
        hour = int(time.split(":")[0])
        minute = int(time.split(":")[1])  
        return hour*60+minute
   
    idx = 0
    now_time = get_minute(plans[0][1])
    while plans:

        if idx == len(plans)-1:
            answer.append(plans[idx][0])
            for i in range(len(jobs)):
                
                answer.append(jobs.pop()[0])
            break
        
        now, future = plans[idx], plans[idx + 1]
        gap =  get_minute(future[1]) - get_minute(now[1])
        finish_time = gap - int(now[2])
        if int(now[2]) < gap:
            answer.append(now[0])
            plans.pop(idx)
            for i in range(len(jobs)-1, -1, -1):           
                    if jobs[i][2] <= finish_time:
                        finish_time = finish_time - jobs[i][2]
                        answer.append(jobs[i][0])
                        jobs.pop(i)                                            
                    else:
                        jobs[i][2] = jobs[i][2] - finish_time  
                        break
            
        elif int(now[2]) == gap:
            answer.append(now[0])
            plans.pop(idx)            
            continue
            
        else:
            plans[idx][2] = int(plans[idx][2]) - gap
            jobs.append(plans[idx])
            idx = idx + 1
            
        
    return answer

결과

profile
알고리즘 정리 블로그입니다.

0개의 댓글