문제풀이/프로그래머스
[프로그래머스] - 과제 진행하기
얄루몬
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문을 돌면 된다)