오답
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문을 돌면 된다)
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 카드 뭉치(파이썬) (0) | 2023.04.12 |
---|---|
프로그래머스 - 바탕화면 정리 (파이썬) (0) | 2023.04.12 |
[프로그래머스] - 연속된 부분 수열의 합 (0) | 2023.04.11 |
[프로그래머스] - 달리기 경주 (파이썬/자바) (0) | 2023.04.10 |
[프로그래머스] - 성격 유형 검사하기 (1) | 2023.04.08 |