셔틀버스 카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다. 이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자. 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다. 일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라. 단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다. 입력 형식 셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다. 0 < n ≦ 10 0 < t ≦ 60 0 < m ≦ 45 timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다. 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다. 출력 형식 콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.
풀이
def solution(n, t, m, timetable):
import datetime as dt
from collections import deque
table = deque(sorted([dt.datetime(2022, 1, 1, int(i[:2]), int(i[3:])) for i in timetable]))
que = deque()
# n대의 버스
for i in range(n):
# 도착시각
arrive = dt.datetime(2022, 1, 1, 9, 0) + (i * dt.timedelta(minutes = t))
# 버스보다 빨리 도착하는 크루는 줄에 추가
while table:
if table[0] <= arrive:
que.append(table.popleft())
else:
break
# 마지막 버스인 경우 탈 수 있는 순위 확인
if i == n - 1:
print('마지막 버스를 기다리는 사람들 =', que)
# 마지막 버스를 기다리고 있는 사람이 정원 미만이면 마지막 버스 출발시각에 줄서기
if len(que) < m:
return arrive.strftime('%H:%M')
# 마지막 버스를 기다리고 있는 사람이 정원 이상이면 탈 수 있는 순위 체크
else:
lastman = que[m - 1] # 얘보다 1분 일찍 줄서기
answer = lastman + dt.timedelta(minutes = -1)
return answer.strftime('%H:%M')
# m 명 출발
cnt = 0
while que and cnt < m:
que.popleft()
cnt += 1
def solution(n, t, m, timetable):
timetable.sort()
bus_table = []
last = make_time(540 + (n-1) * t)
if timetable[0] > last:
return last
for i in range(n):
bus_table.append(make_time(540 + i*t))
print("버스 시간표:", bus_table)
print("사람 시간표:", timetable)
for j in range(len(bus_table)):
p = 0
people_on_bus = [] #이번 버스에 탄 사람들 목록
for i in range(len(timetable)):
if timetable[i] != "탑승":
if m == p:
print("탑승인원 초과, 다음버스")
break
if timetable[i] <= bus_table[j]:
print(bus_table[j], "시에,", timetable[i], "에 온 사람이 탑승")
people_on_bus.append(timetable[i])
timetable[i] = "탑승"
p += 1
continue
else:
print("시간 초과, 다음버스")
p = 0
break
if len(people_on_bus) != m:
return bus_table[j]
else:
return make_time(make_num(max(people_on_bus))-1)
def make_time(num): #숫자를 시간으로
hour = str(num // 60)
min = str(num % 60)
if int(hour) < 10:
hour = "0" + hour
if int(min) < 10:
min = "0" + min
return hour + ":" + min
def make_num(time): #시간을 숫자로(분 단위)
timelist = time.split(":")
return int(timelist[0]) * 60 + int(timelist[1])