https://programmers.co.kr/learn/courses/30/lessons/17678
특정 알고리즘을 사용하는 문항은 아니고 구현력을 보는 문제였다.
시간을 분으로 바꾸어 연산을 편리하게 하였다.
가장 늦게 버스를 탈 수 있는 경우는 막차를 타는 경우이다.
막차를 타는 경우에 두가지 경우의 수가 있는데,
버스 탑승인원이 가득 찼다면, 제일 마지막에 버스에 탑승하는 사람보다 1분먼저 도착해야한다.
버스 탑승인원이 가득 차지 않았다면, 버스도착시간에 맞추어 도착하면 된다.
timetomin함수는 분단위로 바꾸어주는 함수이고, 막차 전까지 앞의 버스를 보내는 연산을 하였다.
막차에 도달았을때, 제일 먼저 도착한 사람부터 버스 도착시간보다 빠르다면 탑승인원에서 제하였고, 버스가 꽉차게 되면 반복문을 탈출하였다.
m값이 1보다 크다는 것은 버스에 여유자리가 있다는 의미이므로, 현재시간을 정답으로 넣었다.
m값이 0이라는 것은 제일 마지막에 탑승한 사람보다 1분먼저 도착하는 시간을 정답으로 넣었다.
def solution(n, t, m, timetable):
answer = 0
minutetable = timetomin(timetable)
cur_time = 540
while(n > 1): ## 막차 전까지 앞에 버스 보내기
for i in range(m):
if minutetable[-1] <= cur_time:
minutetable.pop()
cur_time += t
n -= 1
minutetable.sort()
for time in minutetable:
if time <= cur_time:
m -= 1
if m == 0:
answer = time
break;
if m > 0:
answer = cur_time
else:
answer -= 1
h = answer // 60
m = answer % 60
if h < 10: h = f'0{h}'
if m < 10: m = f'0{m}'
return f'{h}:{m}'
def timetomin(timetable):
table = []
for time in timetable:
h,m = time.split(':')
h,m = int(h),int(m)
m += 60 * h
table.append(m)
table.sort(reverse = True)
return table