프로그래머스 셔틀버스 파이썬 풀이

기석·2022년 2월 10일
0

프로그래머스

목록 보기
3/13
post-thumbnail

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


문제 요약

  1. 회사에서 운영하는 셔틀버스를 최대한 늦은 시간에 타려 한다.
  2. 셔틀은 9:00 부터 총 n회 t분 간격으로 m명을 태우고 간다.
  3. 셔틀은 도착 했을 때 먼저 온 순서대로 m명을 태우고 간다.
  4. 크루들의 도착시간과 n, t, m이 주어 질 때,
  5. 셔틀버스를 탈 수 있는 가장 늦은 시간을 return 하라.

유의사항

  • timetable은 정렬되어 있지 않다.
  • 같은 시간에 도착한 크루 중 가장 우선순위가 낮다.

접근 방법

  1. 9시부터 n회, t분 간격으로 반복문을 순회한다.
  2. 이 때 현재 station에 남아있는 인원이 m보다 작다면 answer 배열에 넣는다.
  3. 반대의 경우 현재 시간 값을 1분씩 빼가며 반복문을 순회한다.
  4. 이 때도 마찬가지로 현재 station에 남아있는 인원이 m보다 작다면 answer 배열에 넣는다.
  5. answer 배열 중 가장 큰 값을 반환한다.

구현 상세

  • 구현의 편의성을 위해 모든 시간을 분 단위로 변환하여 계산한다.
    - 이를 위해 h_to_m(t), m_to_h(t) 함수를 만들었다.
  • station에 현재 남아있는 인원을 구하기 위해 bisect_right 함수와 이미 버스를 타고 떠난 인원을 가리키는 gone 변수를 사용하였다.

코드

from bisect import bisect_right

def h_to_m(t):
    h, m = map(int, t.split(':'))
    return h*60 + m
def m_to_h(t):
    return f'{t//60:02}:{t%60:02}'
    
def solution(n, t, m, timetable):
    answer = []
    minute_table = sorted([h_to_m(t) for t in timetable])
    
    gone = 0
    for time in [9*60+i*t for i in range(n)]:
        station = bisect_right(minute_table, time) - gone
        if station < m:
            answer.append(time)
            gone += station
            continue

        t = time
        while t >= 0:
            t-=1
            station = bisect_right(minute_table, t) - gone
            if station < m:
                answer.append(t)
                break
        gone += m
    return m_to_h(max(answer))
profile
블로그 이사갔어요 https://kiseoky.tistory.com

0개의 댓글