728x90
https://school.programmers.co.kr/learn/courses/30/lessons/176962
나의 풀이
- 과제가 주어졌을 때(시간별로 정렬되어 있지 않음) 시작 시간에 과제를 시작함
- 다음 과제시간이 되면 이전에 하던 과제는 그만해야 함
- 과제 시간이 끝나고 다음 과제 시간까지 텀이 있다면 못 끝낸 과제를 진행함
- 가장 최근에 멈춘 과제부터 시작해야 함
우선 plans의 시간을 minutes로만 표현하고 시간이 빠른 순서대로 정렬한다.
그 후 순서대로 2개의 plan을 가져와 앞의 과제가 끝나는 시간과 다음 과제의 시작 시간을 비교한다.
pred_end > tail_start라면 과제를 중단한 것이기 때문에 left_table에 과제명과 남은 시간을 저장한다.
pred_end <= tail_start 라면 과제 후 시간이 남은 것이기 때문에 중단한 과제를 시작해야 한다.
남은 시간을 left_time에 넣고 left_table에서 중단된 과제를 가져와 처리한다.
가장 최근에 멈춘 과제부터 시작해야 하기 때문에 Stack을 사용함
def change_time(time):
hours, minutes = map(int,time.split(':'))
return int(minutes + (hours*60))
def solution(plans):
answer = []
left_table = []
left_time = 0
for plan in plans:
plan[1] = change_time(plan[1])
plans.sort(key=lambda x: x[1])
for i, (plan_1, plan_2) in enumerate(zip(plans, plans[1:])):
pred_end, tail_start = plan_1[1]+int(plan_1[2]), plan_2[1]
if pred_end > tail_start:
left_table.append([plan_1[0], pred_end - tail_start])
else:
answer.append(plan_1[0])
left_time = tail_start - pred_end
while left_time > 0:
if left_table:
plan = left_table.pop()
left_time = left_time - plan[1]
else:
break
if left_time >= 0 :
answer.append(plan[0])
else:
plan[1] = -left_time
left_table.append(plan)
answer.append(plans[-1][0])
while left_table:
answer.append(left_table.pop()[0])
return answer
다른 사람의 코드
나는 남은 시간을 없애는 방식으로 접근했으나 work 시작 ~ work 끝의 시간을 구해 길이가 짧은 순서대로 반환함
def solution(plans):
plans = sorted(map(lambda x: [x[0], int(x[1][:2]) * 60 + int(x[1][3:]), int(x[2])], plans), key=lambda x: -x[1])
print(plans)
lst = []
while plans:
x = plans.pop()
for i, v in enumerate(lst):
if v[0] > x[1]:
lst[i][0] += x[2]
lst.append([x[1] + x[2], x[0]])
lst.sort()
return list(map(lambda x: x[1], lst))
728x90
'Coding Test > programmers' 카테고리의 다른 글
[Python] 파이썬 프로그래머스 타겟 넘버 (0) | 2023.04.12 |
---|---|
[Python] 파이썬 프로그래머스 광물 캐기 (0) | 2023.04.03 |
[Python] 파이썬 프로그래머스 주식가격 (1) | 2023.03.31 |
[Python] 파이썬 프로그래머스 다리를 지나는 트럭 (0) | 2023.03.31 |
[Python] 파이썬 프로그래머스 최고의 집합 (0) | 2023.03.21 |