🌱 나의 풀이
def solution(plans):
answer = []
plans.sort(key=lambda x: x[1])
stop = []
while plans:
if len(plans) > 1:
name1, start1, playtime1 = plans[0]
name2, start2, playtime2 = plans[1]
t1 = int(start1[:2]) * 60 + int(start1[3:])
t1_end = t1 + int(playtime1)
t2 = int(start2[:2]) * 60 + int(start2[3:])
if t1_end > t2: # 새로운 일이 들어옴, 현재 작업 중단
stop.append([t1_end - t2, name1])
plans.pop(0)
else: # 진행중인 과제를 끝냄
answer.append(name1)
plans.pop(0)
temp = t2 - t1_end
while stop:
if stop[-1][0] <= temp: # 중단된 작업 다시 시작
temp -= stop[-1][0]
answer.append(stop.pop()[1])
else:
stop[-1][0] -= temp
break
else:
answer.append(plans.pop(0)[0])
return answer + list(map(lambda x : x[1], stop[::-1]))
1. plans 리스트에 원소가 2개 이상 있으면
- 현재 작업 plans[0]의 끝나는 시각 > 다음 작업 plans[1]의 시작 시각
- 현재 작업 plans[0]을 진행하던 중에 다음 작업 plans[1]이 들어왔다.
- 현재 작업을 중단한다.
- stop에 [남은 시간, 이름]을 추가
- 그렇지 않으면, 진행 중인 과제를 끝낼 수 있다.
- answer에 추가한다.
- 중단된 작업이 있으면
- 최근 중단된 작업 stop[-1][0] <= 다음 작업까지 남은 시간
- answer에 최근 중단된 작업을 추가한다.
- 그렇지 않으면, 최근 중단된 작업의 남은 시간 - 다음 작업까지 남은 시간
- 최근 중단된 작업 stop[-1][0] <= 다음 작업까지 남은 시간
2. plans에 원소가 1개 남았으면 answer에 바로 추가한다.
3. stop에 남은 원소가 있을 수도 있어서 추가한다.
🐘 다른 사람 풀이
# https://cochin-man.tistory.com/25
import copy
def solution(plans):
answer = []
stop = []
plans = sorted(plans, key = lambda x : x[1])
for i in range(len(plans)) :
if i != len(plans) - 1 : # 마지막이 아니라면
temp = int(plans[i][1][0:2]) * 60 + int(plans[i][1][3:]) + int(plans[i][2])
next = int(plans[i+1][1][0:2]) * 60 + int(plans[i+1][1][3:])
if temp <= next :
answer.append(plans[i][0]) # 다음 것 안에 끝났으면
if len(stop) > 0 : # 멈춘 것이 있다면
lis = copy.deepcopy(stop)
tp = next - temp
for j in range(len(stop) - 1, -1, -1) :
if stop[j][1] <= tp :
tp -= stop[j][1]
answer.append(stop[j][0])
lis.pop()
else :
lis[-1][1] = stop[j][1] - tp
break
stop = copy.deepcopy(lis)
else : # 못 끝낸다면
stop.append([plans[i][0], temp - next])
else :
answer.append(plans[i][0]) # 마지막꺼는 걍 끝내면 된다.
for i in range(len(stop) - 1, -1, -1) :
answer.append(stop[i][0])
return answer
나와 비슷한 풀이
문제 출처 👇
https://school.programmers.co.kr/learn/courses/30/lessons/176962?language=python3
반응형
'coding test' 카테고리의 다른 글
[파이썬] 부대복귀 (0) | 2023.04.11 |
---|---|
[파이썬] 호텔 대실 (0) | 2023.04.10 |
[파이썬, Java] 택배 배달과 수거하기 (0) | 2023.04.02 |
[파이썬] 디펜스 게임 (0) | 2023.04.01 |
[파이썬] 17822. 원판 돌리기 (0) | 2023.03.16 |