카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
09:00
부터 총 n
회 t
분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m
명의 승객이 탈 수 있다.09:00
에 도착한 셔틀은 자리가 있다면 09:00
에 줄을 선 크루도 탈 수 있다.일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59
에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
n
, 셔틀 운행 간격 t
, 한 셔틀에 탈 수 있는 최대 크루 수 m
, 크루가 대기열에 도착하는 시각을 모은 배열 timetable
이 입력으로 주어진다.n
≦ 10t
≦ 60m
≦ 45timetable
은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM
형식으로 이루어져 있다.HH:MM
은 00:01
에서 23:59
사이이다.HH:MM
형식이며, 00:00
에서 23:59
사이의 값이 될 수 있다.n | t | m | timetable | answer |
---|---|---|---|---|
1 | 1 | 5 | ["08:00", "08:01", "08:02", "08:03"] | "09:00" |
2 | 10 | 2 | ["09:10", "09:09", "08:00"] | "09:09" |
2 | 1 | 2 | ["09:00", "09:00", "09:00", "09:00"] | "08:59" |
1 | 1 | 5 | ["00:01", "00:01", "00:01", "00:01", "00:01"] | "00:00" |
1 | 1 | 1 | ["23:59"] | "09:00" |
10 | 60 | 45 | ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] | "18:00" |
# 코드
import datetime
def solution(n, t, m, timetable):
answer = ''
bus_dict = {}
timetable.sort(reverse=True)
timetable = [datetime.datetime(2000, 1, 1, int(t[:2]), int(t[-2:]), 0) for t in timetable]
bus_time = datetime.datetime(2000, 1, 1, 9, 0, 0)
td = datetime.timedelta(minutes=t)
# 각 버스 시간의 탑승객 조사
for i in range(n):
bus = (bus_time.hour, bus_time.minute)
bus_dict[bus] = []
while timetable and timetable[-1] <= bus_time:
if len(bus_dict[bus]) == m:
break
bus_dict[bus].append(timetable.pop())
bus_time = bus_time + td
bus_time = bus_time - td
# 마지막 버스의 시간, 탑승객 확인
last_time = (bus_time.hour, bus_time.minute)
crews = bus_dict[last_time]
# 이용 좌석이 남았다면 마지막 버스 시간에 맞추어 도착
if m > len(crews):
answer = str(last_time[0]) + ':' + str(last_time[1])
if ':' in answer[:2]:
answer = '0' + answer
if ':' in answer[-2:]:
answer = answer[:3] + '0' + answer[-1]
# 가득 찼다면 마지막에 탄 사람의 시간보다 1분 먼저 도착
else:
crews[-1] = crews[-1] + datetime.timedelta(minutes=-1)
answer = str(crews[-1].hour) + ':' + str(crews[-1].minute)
if ':' in answer[:2]:
answer = '0' + answer
if ':' in answer[-2:]:
answer = answer[:3] + '0' + answer[-1]
return answer