Search

PGS 셔틀버스

태그
구현

문제 설명

콘이 셔틀버스를 타고 출근할 수 있는 가장 늦은 시간을 구하는 문제

예제 입력/출력

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"

제약 조건

0<n100 < n ≤ 10
0<t600 < t ≤ 60
0<m450 < m ≤ 45

문제 풀이

접근1 정렬 + 시뮬레이션 - O(nlogn)O(nlogn)
1.
시간표 생성
# 크루, 버스 시간표 생성 crew_times = [int(time[:2]) * 60 + int(time[3:]) for time in timetable] crew_times.sort() bus_times = [9*60 + t*i for i in range(n)]
Python
복사
시간 계산을 쉽게 해주기 위해 크루들의 도착 시간을 분 단위로 변환하여 정렬한다.
셔틀 도착 시간(분)을 리스트로 생성한다.
2.
셔틀 운행 시뮬레이션
i = 0 # 다음에 버스에 오를 크루 인덱스 번호 for bus_time in bus_times: cnt = 0 # 버스 승객 카운팅 # 승객 탑승 while cnt < m and i < len(crew_times) and crew_times[i] <= bus_time: cnt += 1 i += 1
Python
복사
각 셔틀 도착 시간마다 대기 중인 크루들을 m명씩 태운다.
3.
콘이 탈 수 있는 가장 늦은 시간 찾기
if cnt < m: # 자리가 남았을 경우 answer = bus_time else: # 자리가 없을 경우 맨 마지막 크루보다 1분 일찍 탑승 answer = crew_times[i - 1] - 1
Python
복사
a.
크루들을 다 태운 뒤에 마지막 셔틀에 자리가 남으면 콘은 해당 셔틀 출발 시간에 탑승
b.
자리가 꽉 찼다면, 마지막으로 탄 크루보다 1분 일찍 도착해야 한다.
for문 안에서 탑승을 처리할 때 잘못하면 인덱스를 1 차이로 벗어나서 한 명을 더 태우거나, 덜 태우거나, 런타임에러가 나오기 쉬워서 조심해야 한다.

풀이 코드

def solution(n, t, m, timetable): answer = 0 # 크루, 버스 시간표 생성 crew_times = [int(time[:2]) * 60 + int(time[3:]) for time in timetable] crew_times.sort() bus_times = [9*60 + t*i for i in range(n)] i = 0 # 다음에 버스에 오를 크루 인덱스 번호 for bus_time in bus_times: cnt = 0 # 버스 승객 카운팅 # 승객 탑승 while cnt < m and i < len(crew_times) and crew_times[i] <= bus_time: cnt += 1 i += 1 if cnt < m: # 자리가 남았을 경우 answer = bus_time else: # 자리가 없을 경우 맨 마지막 크루보다 1분 일찍 탑승 answer = crew_times[i - 1] - 1 return f"{str(answer // 60).zfill(2)}:{str(answer % 60).zfill(2)}"
Python
복사

참고 자료