반응형
https://school.programmers.co.kr/learn/courses/30/lessons/176962
나의 풀이
from collections import deque
def solution(plans):
# 리스트 시간순 정렬
plans.sort(key=lambda x:x[1])
# 시간을 숫자로 변환 및 타입 변경
for i in range(len(plans)):
h, m = plans[i][1].split(':')
plans[i][1] = int(h)*60+int(m)
plans[i][2] = int(plans[i][2])
stop = deque()
answer = []
for i in range(len(plans)):
now = plans[i][1]
next_st = now
# next_st를 리스트 마지막이면 다음 시작 시간이 없으므로 해당 과목 끝나는 시간으로 설정
if i == len(plans)-1:
next_st = now+plans[i][2]
# 아닌 경우 다음 과목 끝난느 시간으로 설정
else:
next_st = plans[i+1][1]
# 실제 사용한 시간
used = now+plans[i][2]-next_st
# 남은 시간
rest = next_st-(now+plans[i][2])
# 현재 시간
now += used
# 시간이 부족했다면 stop에 추가
if rest<0:
stop.append([plans[i][0], -rest])
# 시간이 딱맞게 끝났거나 남았다면
if rest>=0:
answer.append(plans[i][0])
# 남은 시간 없을 때 까지
while rest>0:
# stop에 과목있다면
if len(stop)>0:
[sub, time] = stop.pop()
# 꺼낸 과제 완료
if rest>=time:
answer.append(sub)
rest-=time
# 시간 부족했으면 다시 stop에 넣기
else:
used = time-rest
stop.append([sub, used])
rest=0
else:
break
# 리스트 마지막까지 돌았으면, 역순으로 과목 끝내므로 answer에 추가
if i == len(plans)-1 and len(stop)>0:
while len(stop)>0:
answer.append(stop.pop()[0])
return answer
오랜만이라 머리가 안돌아간다
다른 사람의 풀이
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])
# 시작 시간 기준 내림차순
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
반응형
'개발 > Algorithm 문제 풀이' 카테고리의 다른 글
[프로그래머스] lv2. 순위 검색 (0) | 2024.02.12 |
---|---|
[프로그래머스] lv.1 가장 많이 받은 선물 (0) | 2024.01.29 |
[프로그래머스] for 문과 if문을 한번에 (0) | 2022.07.15 |
[프로그래머스] lv.2 피로도 (0) | 2022.07.10 |
[프로그래머스] lv.2 양궁 대회 (0) | 2022.06.12 |