프로그래머스/LV2

[프로그래머스 Lv2, python] - 과제 진행하기

chyam_eun 2025. 4. 3. 13:20

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

def solution(plans):
    answer = [] # 완료된 과제 
    for i in range(len(plans)): # 시간을 분단위로 바꾸기 
        h, m = map(int, plans[i][1].split(':'))
        st = h*60+m
        plans[i][1] = st
        plans[i][2] = int(plans[i][2])
        
    plans.sort(key=lambda x:x[1]) # 시작 시간 순으로 정렬
    stack = []
    for i in range(len(plans)):
        if i == len(plans)-1: # 마지막 과제이면 
            stack.append(plans[i]) # 완료시키고 종료
            break
        
        sub, st, t = plans[i] # 이름, 시작시간, 남은 소요 시간
        nsub, nst, nt = plans[i+1] # 다음 이름, 다음 시작시간, 다음 남은 소요시간
        if st + t <= nst: # 시작시간+남은 소요시간이 다음시작시간 전이면 
            answer.append(sub) # 완료시키기
            temp_time = nst - (st+t) # 남는 시간
            
            while temp_time != 0 and stack: # 남는시간이 있고 중단된 과제가있으면 
                tsub, tst, tt = stack.pop()
                if temp_time >= tt: # 남는 시간이 소요시간보다 많으면 
                    answer.append(tsub) # 완료시키기
                    temp_time -= tt # 남는시간
                else: # 적으면 
                    stack.append([tsub, tst, tt - temp_time]) # 남는시간 갱신해서 추가시킴
                    temp_time = 0 # 남는시간 0 
            
        else: # 다 못하면
            plans[i][2] = t - (nst - st) 시간줄이기
            stack.append(plans[i]) # 중단된 과제에 넣기 
        
    while stack: # 완료되지 않은 과제가 남아있으면 
        sub, st, tt = stack.pop()
        answer.append(sub) # 완료시키기

    return answer

 

아래는 1개의 테스트 케이스가 통과되지 못했던 처음 코드이다,, 

def solution(plans):
    res, stop = [],[]
    plans = sorted(plans, key = lambda x:x[1]) # 시간 순서대로 정렬하기 
    times = {} 
    for i in plans:
        times[i[0]] = int(i[2]) # 남은 시간들 담아두기
        h, m = i[1].split(":")
        i[1] = int(h) * 60 + int(m) # 시간을 분단위로 바꿔두기
        
    idx, start_time = 0, plans[0][1]
    
    while idx < len(plans):
        # 과제 시작하기로 한 시각 되면 시작
        name= plans[idx][0] # 이름
        if idx < len(plans) - 1:
            next_time = plans[idx+1][1]
            if next_time < times[name] + start_time: # 과제 끝날 시간이 더 이후이면
                times[name] -= next_time - start_time
                start_time = next_time
                stop.append(name)
            else: # 이전이면
                start_time += times[name]
                times[name] = 0
                res.append(name)
            if len(stop) == 0 and start_time < next_time:
                start_time = next_time
            # 중단된 과제 중 남은 시간이 있으면 다시 수행
            while stop and start_time < next_time:
                paused_name = stop.pop()
                if start_time + times[paused_name] <= next_time:
                    res.append(paused_name)
                    start_time += times[paused_name]
                else:
                    stop.append(paused_name)
                    times[paused_name] -= next_time - start_time
                    start_time = next_time
        else: # 마지막 과제
            res.append(name)
            while stop:
                res.append(stop.pop())    
        idx += 1
    return res