728x90
SMALL
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
from collections import deque
def transform_time(time):
h, m = map(int, time.split(':'))
return h * 60 + m
def solution(plans):
plans.sort(key=lambda x: transform_time(x[1]))
answer = []
pause_hw = []
current_hw = None
current_end_time = 0
for plan in plans:
name, start_time, playtime_time = plan
start = transform_time(start_time)
playtime = int(playtime_time)
end = start + playtime
if current_hw is None:
# 현재 과제가 없으면 새로운 과제를 시작
current_hw = name
current_end_time = end
continue
if start < current_end_time:
# 새로운 과제가 현재 과제 끝나기 전에 시작되면 현재 과제 중단
remaining_time = current_end_time - start
pause_hw.append((current_hw, remaining_time))
# 새로운 과제를 현재 과제로 설정
current_hw = name
current_end_time = end
else:
# 현재 과제 완료하고, 중단된 과제를 재개할 수 있는지 확인
answer.append(current_hw)
while pause_hw and end >= current_end_time:
last_hw, last_remaining = pause_hw.pop()
if current_end_time + last_remaining <= start:
# 중단된 과제 완전히 끝낼 수 있으면 완료
answer.append(last_hw)
current_end_time += last_remaining
else:
# 중단된 과제 부분적으로 끝내고 다시 멈춘 과제에 저장
pause_hw.append((last_hw, last_remaining - (start - current_end_time)))
current_end_time = start
break
# 새로운 과제 현재 과제로 설정
current_hw = name
current_end_time = end
# 마지막 과제 완료
if current_hw:
answer.append(current_hw)
# 멈춘 과제에 남아있는 과제들 완료 순서대로 추가
while pause_hw:
answer.append(pause_hw.pop()[0])
return answer
왜 이렇게 풀었을까?
필요한 사전 지식
- 시간 변환(문자열에서부터 시간 추출해내기), 정렬, 스택
이 문제로부터 구현력 기르기
- 과제 시작하기 전, 현재 진행 중인 과제가 있는지를 확인하고, 새로운 과제의 시작 시점이 현재 과제 종료 시점보다 빠르면, 남은 시간을 계산한 뒤 현재 과제를 스택에 일시 중단한 과제로 보관합니다.
- 반대로, 새 과제가 시작되는 시점이 이전 과제의 종료를 기다릴 수 있다면, 그 과제를 최종 결과에 저장하고 스택에 중단된 과제들이 있다면 재개 가능한 만큼 처리했습니다.
- 스택에는 (과제 이름, 남은 시간) 형태로 저장해두고, 재개할 때는 스택에서 하나씩 꺼내 현재 시점과 비교하여 남은 시간을 소화할 수 있는지 확인합니다.
- 전부 소화 가능하면 과제를 완료하고, 남은 시간이 있으면 다시 멈춰서 스택에 되돌려 놓는 식으로 단계적으로 처리합니다.
이 문제로부터 연상력 기르기
- 여러 작업이 순차적으로 시작될 때, 우선순위를 변경하거나 특정 조건에서 작업을 중단하거나 다시 시작하는 문제는 운영체제의 스케줄러 구현과 유사해 보입니다.
- 만약에 중단된 과제를 다시 재개할 때, 가장 최근이 아니라 가장 먼저 멈춘 과제부터 재개한다면 큐를 사용할 수도 있을 것 같습니다.
728x90
LIST
'알고리즘 문제 > 프로그래머스 (Level 2)' 카테고리의 다른 글
📗 점 찍기 (0) | 2024.12.18 |
---|---|
📗 문자열 압축 (0) | 2024.12.16 |
📗 우박수열 정적분 (6) | 2024.11.27 |
📗 멀쩡한 사각형 (1) | 2024.11.17 |
📗 하노이의 탑 (4) | 2024.11.16 |