문제 설명
•
콘이 셔틀버스를 타고 출근할 수 있는 가장 늦은 시간을 구하는 문제
예제 입력/출력
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" |
제약 조건
•
•
•
문제 풀이
•
접근1 정렬 + 시뮬레이션 -
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
복사