티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/17678
1. 접근 방식
- 모든 시간 데이터를 분 단위로 환산하자.
기존 데이터는 시와 분으로 나뉘어져 있고, 심지어 문자열이다. 경험에 의하면 이런 상황에서는 시간을 분 단위로 환산하여 계산하는 것이 수월하였다.
- 셔틀 버스 운영 시 탑승 크루의 리스트를 만들자.
이를 위해 아래와 같은 작업이 필요하다.
- 버스 운영 시간표를 만들자. (단, 이때 시간은 모두 분 단위로 표시한다.)
- 크루가 대기열에 도착하는 시각이 담긴 timetable을 분 단위로 환산한다.
이때 중요한 것은 만약 크루의 도착 시간이 마지막 버스 운영 시간보다 크다면 timetable에 담지 않는다. 마지막 버스에 탑승하지 않은 못한 크루는 결국 그 날 셔틀 버스에 탑승하지 못한다. 즉, 탑승 크루 리스트를 만드는 데 필요하지 않은 크루이므로 고려할 필요가 없기 때문이다.
① 만약 timetable이 비어 있거나, timetable 길이가 한 셔틀에 탈 수 있는 최대 크루 수 m보다 작다면 "콘"은 자유롭게 가장 마지막 버스에 탑승하면 된다. 굳이 셔틀 버스에 탑승하는 크루 리스트를 생성할 필요가 없다.
② 반면 timetable 길이가 m보다 크거나 같다면 셔틀 버스에 탑승하는 크루 리스트를 생성한 후, 마지막 버스에 탑승하는 고객 리스트에 집중하자.
⒜ 만약 마지막 버스에 탑승한 고객이 m보다 작다면, "콘"은 마지막 버스 시간에 맞춰 느긋하게 도착하면 된다.
⒝ 마지막 버스에 탑승한 인원이 m보다 크거나 같다면, "콘"은 얍쌉하게 가장 늦게 도착하는 크루보다 1분만 일찍 도착하면 된다.
2. 정답 코드
def make_bus_schedule(count, interval):
return [9 * 60 + i * interval for i in range(count)]
def change_to_minutes(string):
hh, mm = map(int, string.split(':'))
return hh * 60 + mm
def format_time(x):
hh, mm = x // 60, x % 60
hh = '0' + str(hh) if hh < 10 else str(hh)
mm = '0' + str(mm) if mm < 10 else str(mm)
return hh + ':' + mm
def get_peopleList_on_each_bus(bus, timetable, limit):
length = len(timetable)
result = []
index = 0
for i in range(len(bus)):
result.append([timetable[j] for j in range(index, min(length, index + limit)) if timetable[j] <= bus[i]])
index += len(result[i])
return result
def solution(n, t, m, timetable):
bus = make_bus_schedule(n, t)
timetable = [change_to_minutes(time) for time in timetable if change_to_minutes(time) <= bus[-1]]
timetable.sort()
if not timetable or len(timetable) < m:
return format_time(bus[-1])
schedule = get_peopleList_on_each_bus(bus, timetable, m)
if len(schedule[-1]) < m:
return format_time(bus[-1])
else:
return format_time(schedule[-1][-1] - 1)
레벨3인 것을 모른 채 문제에 도전했다. 처음엔 문제를 이해하는 데도 어려웠고, 머릿속에서 어렴풋이 떠오르는 방법을 코드로 구현하기가 힘들었지만 결국 풀어내어 기쁘다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [3차] 압축 파이썬 풀이 (0) | 2023.06.27 |
---|---|
[프로그래머스] 베스트앨범 파이썬 풀이 (0) | 2023.06.25 |
[프로그래머스] k진수에서 소수 개수 구하기 파이썬 정답 코드 (0) | 2023.06.20 |
[프로그래머스] 바탕화면 정리 파이썬 정답 코드 (0) | 2023.06.19 |
[프로그래머스] [3차] 방금그곡 파이썬 정답 코드 (0) | 2023.06.18 |