문제 요약
- 회사에서 운영하는 셔틀버스를 최대한 늦은 시간에 타려 한다.
- 셔틀은 9:00 부터 총 n회 t분 간격으로 m명을 태우고 간다.
- 셔틀은 도착 했을 때 먼저 온 순서대로 m명을 태우고 간다.
- 크루들의 도착시간과 n, t, m이 주어 질 때,
- 셔틀버스를 탈 수 있는 가장 늦은 시간을 return 하라.
유의사항
- timetable은 정렬되어 있지 않다.
- 같은 시간에 도착한 크루 중 가장 우선순위가 낮다.
접근 방법
- 9시부터 n회, t분 간격으로 반복문을 순회한다.
- 이 때 현재 station에 남아있는 인원이 m보다 작다면 answer 배열에 넣는다.
- 반대의 경우 현재 시간 값을 1분씩 빼가며 반복문을 순회한다.
- 이 때도 마찬가지로 현재 station에 남아있는 인원이 m보다 작다면 answer 배열에 넣는다.
- answer 배열 중 가장 큰 값을 반환한다.
구현 상세
- 구현의 편의성을 위해 모든 시간을 분 단위로 변환하여 계산한다.
- 이를 위해 h_to_m(t), m_to_h(t) 함수를 만들었다.
- station에 현재 남아있는 인원을 구하기 위해 bisect_right 함수와 이미 버스를 타고 떠난 인원을 가리키는 gone 변수를 사용하였다.
코드
from bisect import bisect_right
def h_to_m(t):
h, m = map(int, t.split(':'))
return h*60 + m
def m_to_h(t):
return f'{t//60:02}:{t%60:02}'
def solution(n, t, m, timetable):
answer = []
minute_table = sorted([h_to_m(t) for t in timetable])
gone = 0
for time in [9*60+i*t for i in range(n)]:
station = bisect_right(minute_table, time) - gone
if station < m:
answer.append(time)
gone += station
continue
t = time
while t >= 0:
t-=1
station = bisect_right(minute_table, t) - gone
if station < m:
answer.append(t)
break
gone += m
return m_to_h(max(answer))