문제풀이/프로그래머스

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

얄루몬 2023. 4. 12. 14:50

오답

from collections import deque
def solution(plans):
    answer = []
    plans.sort(key=lambda x:x[1])
    stack = []

    dq = deque(plans)
    
    n,t,p = dq[0]
    
    while dq:
        if len(dq) > 1:
            n1,s1,p1 = dq[0]
            n2,s2,p2 = dq[1]
    
            t1 = int(s1[:2])*60 + int(s1[3:])
            t1_end = t1+int(p1)
            t2 = int(s2[:2]) * 60 + int(s2[3:])
            if t1_end > t2:
                stack.append(n1)
            else:
                answer.append(n1)
            dq.popleft()
        else:
            n,s,p= dq[0]
            answer.append(n)
            break
    
    
    return answer + stack[::-1]

 

 

정답

from collections import deque
def solution(plans):
    answer = []
    stack =[]
    plans.sort(key=lambda x:x[1])
    q = deque(plans)
    while q:
        if len(q) > 1:
            n1,s1,p1 = q[0]
            n2,s2,p2 = q[1]
            
            t1 = int(s1[:2])*60 + int(s1[3:])
            t1_end = t1 + int(p1)
            
            t2 = int(s2[:2])*60 + int(s2[3:])
            
            if t1_end > t2:
                stack.append([n1, t1_end - t2])
                q.popleft()
            else:
                answer.append(n1)
                q.popleft()
                spare_time = t2 - t1_end
                while stack and spare_time > 0:
                    if stack[-1][1] <= spare_time:
                        spare_time -= stack[-1][1]
                        answer.append(stack[-1][0])
                        stack.pop()
                    else:
                        stack[-1][1] -= spare_time
                        break
        else:
            n,s,p = q[0]
            answer.append(n)
            q.pop()
    
    return answer + list(map(lambda x: x[0], stack[::-1]))
  • 핵심1  뒤에 과제가 현재 과제가 끝나는 시간보다 빠를 경우 멈춘 과제 목록으로 넣어두는 것 
  • 핵심2 뒤에 시작되는 과제가 현재 과제 끝나는 시간보다 더 느린 경우엔 현재 과제는 모두 완료 가능 
    • 이때 남는 시간이 있다면 멈췄던 과제를 다시 시작해야 한다.
    • 이때 멈췄던 과제가 남는 시간만큼 다 돌면서 확인되어야 한다. (stack이 있을 동안 while문을 돌면 된다)