[프로그래머스] 셔틀버스

HL·2021년 3월 18일
0

프로그래머스

목록 보기
34/44

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17678

문제 설명

  • 버스 시간, 버스 정원이 주어짐
  • 승객이 정류장에 도착하는 시간 리스트가 주어짐
  • 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각 리턴

풀이

  • 딕셔너리로 누가 어떤 버스에 탈지 구현
    • key : 버스 시간
    • value : 승객 시간 리스트
  • 콘이 마지막 버스에 탈 수 있는지만 체크하면 됨
  • 탈 수 있을 경우
    • 마지막 버스 출발 시간에 오면 됨
  • 탈 수 없을 경우
    • 마지막 버스의 마지막 승객보다 1분 먼저 오면 됨

느낀 점

  • 처음에 어떻게 구현해야 할지 좀 헤맸다
  • 어떻게 모든 경우의 수를 커버해야 할지 잘 떠오르지 않았다
  • 그래서 그냥 구현한 후 생각해 봤다

코드

def solution(n, t, m, timetable):
    buses = get_buses(n, t, m, timetable)
    last_time, last_bus = max(buses.items(), key=lambda x: x[0])
    # 마지막 버스에 자리가 있으면
    if len(last_bus) < m:
        return get_hour(last_time)
    # 마지막 버스에 자리가 없으면
    return get_hour(last_bus[-1] - 1)


def get_buses(n, t, m, timetable):
    buses = {i*t + 540: [] for i in range(n)}
    timetable.sort()
    i, j = 0, 0
    while i < n and j < len(timetable):
        bus = i * t + 540
        crew = get_minute(timetable[j])
        # 탈 수 있으면 태움
        if crew <= bus and len(buses[bus]) < m:
            buses[bus].append(crew)
            j += 1
        # 탈 수 없으면 버스 출발
        else:
            i += 1
    return buses


def get_minute(t):
    h, m = map(int, t.split(':'))
    return h * 60 + m


def get_hour(t):
    h = t // 60
    h = str(h) if h >= 10 else '0' + str(h)
    m = t % 60
    m = str(m) if m >= 10 else '0' + str(m)
    return f'{h}:{m}'
profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글