카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 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을 복습하는 계기가 되었습니다.
자료구조를 조금 고민하고 시간관련 라이브러리 뒤적거리느라 시간이 지체되었지만 어려운 문제는 아니었던 듯