프로그래머스/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