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

Junyoung Park·2022년 1월 1일
0

코딩테스트

목록 보기
36/631

1. 문제 설명

셔틀버스

2. 문제 분석

버스가 오는 시간이 주어지고, 대기하고 있는 사람이 있다면 최대 m명만큼 타고 갈 수 있다. 콘은 '가장 늦게' 도착해야 한다. 즉 '막차'에서 마지막 사람으로 타야 한다. 문제를 푸는 과정은 다음과 같다.

  1. 버스가 9시부터 출발하고 총 n회 t분 간격으로 주어지므로 버스가 오는 시간대를 분 단위의 리스트로 정수화할 수 있다.
  2. 같은 맥락으로 줄을 서는 시간을 정수화한다. 이때 주어지는 timetable이 정렬되지 않을 수 있으므로 sort해주어야 한다. 즉 '순서대로' 줄을 선 사람들의 큐가 주어진다.
  3. 버스 시간마다 '지금' 줄 서고 있는 사람들의 유무를 확인한다. 있다면 최대 'm'명까지 태워보낼 수 있다. 즉 큐에서 pop한다.
  4. 버스 시간이 '막차'라면 막차로 오는 버스 시간과 지금 남아 있는 사람들을 표시한다. 이때 버스 시간보다 늦게 오는 사람들은 탈 수 없으므로 제거한다.
  5. m명보다 지금 줄 선 사람들이 적다면 가장 늦게 타도 된다. 즉 버스가 도착하는 시간에만 대기하면 된다. 그렇지 않다면 콘은 m명에 속하는 가장 '마지막' 사람이 되어야 한다. 그 사람보다 1분만 빨리 대기하면 된다.

3. 나의 풀이

def get_bus(n, t):
    buses = []
    for i in range(0, n):
        buses.append(9*60 + t*i)
    return buses

def solution(n, t, m, timetable):
    buses = get_bus(n, t)
    queue = []

    for person in timetable:
        hour, min = map(int, person.split(':'))
        queue.append(hour*60+min)
    queue.sort()
    last_bus = 0
    for bus in buses:
        if buses[-1] == bus:
            last_bus = bus
            break
        for i in range(m):
            if queue[0] <= bus:
                queue.pop(0)
            else:
                break
    queue = [x for x in queue if x <= last_bus]
    if len(queue) < m:
        kon = last_bus
    else:
        kon = queue[m-1]-1

    h = kon//60
    m = kon - h*60
    h = str(h)
    m = str(m)
    if len(h) == 1: h = '0' + h
    if len(m) == 1: m= '0' + m
    kon = h + ':' + m
    return kon
profile
JUST DO IT

0개의 댓글