카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
입력 형식
셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.
출력 형식
콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.
from datetime import timedelta, datetime
def solution(n, t, m, timetable):
fmt = "%H:%M" #시간 형식
term = timedelta(minutes = t) #셔틀 간격
timetable.sort(reverse=True)
shuttles = [] #셔틀 시간표
shuttle = datetime(2022,8,25,9,0,0) #첫번째 셔틀
#셔틀 시간표 생성
for i in range(0, n):
shuttles.append(shuttle.strftime(fmt))
shuttle = shuttle + term
#셔틀 별 탑승크루 파악
for s in shuttles:
crew = [] #셔틀 별 탑승크루
while(len(crew) < m): #m명까지 탑승가능
if timetable:
if timetable[-1] <= s: #셔틀도착 시간까지 대기열에 선 경우
crew.append(timetable.pop())
else:
break
else:
break
#마지막 셔틀에서
if len(crew) == m: #탑승인원이 가득 찬 경우
last_time = datetime.strptime(crew[-1], fmt) - timedelta(minutes=1) #가장 마지막에 도착한 크루보다 1분 일찍 도착
answer = last_time.strftime(fmt)
else: #탑승인원이 가득 차지 않은 경우
answer = shuttles[-1] #셔틀 도착 시간에 맞춰 도착
return answer
shuttles = [셔틀 도착 시간]
crew = [각 셔틀의 탑승크루 도착 시간]
첫 번째 셔틀인 9시 셔틀을 시작으로 term
간격으로 하여 shuttles
시간표를 생성한다.
shuttles
의 첫 번째 셔틀부터 탑승 인원을 파악한다.
마지막 셔틀의 탑승인원인 crew
에서 탑승 인원이 가득 찬 경우 가장 마지막에 도착한 크루보다 1분 빠르게 도착해야하고 탑승 인원이 가득 차지 않은 경우 셔틀 도착 시간에 맞춰 도착하도록 한다.
datetime
을 문제에서 오래간만에 사용해 봤네요..
timedelta
는 처음 사용해봤는데 역시 없는게 없네요
strftime
과 strptime
을 복습하는 계기가 되었습니다.
자료구조를 조금 고민하고 시간관련 라이브러리 뒤적거리느라 시간이 지체되었지만 어려운 문제는 아니었던 듯