티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


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인 것을 모른 채 문제에 도전했다. 처음엔 문제를 이해하는 데도 어려웠고, 머릿속에서 어렴풋이 떠오르는 방법을 코드로 구현하기가 힘들었지만 결국 풀어내어 기쁘다.

728x90