코딩테스트

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

pythaac 2021. 9. 3. 21:29
프로그래머스 코딩테스트 고득점 Kit의 문제입니다.

https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제

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

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] "18:00"

programmers.co.kr

 

내가 작성한 코드

from collections import defaultdict, Counter

def time_to_str(time):
    h, m = divmod(time,60)
    return str(h).zfill(2) + ":" + str(m).zfill(2)

def str_to_time(time):
    h, m = time.split(":")
    return int(h) * 60 + int(m)

def set_available_time(n, t):
    start = str_to_time("09:00")
    return [i for i in range( start, start+t*(n-1)+1, t)]

def set_crews(dic, available, crews, m):
    i = 0
    for t in available:
        dic[t] = []
    # 배차시간 순서대로
    crnt_time = available[i]
    for crew in crews:
        # 배차 자리가 남았을 경우 and (해당 배치 시간이 꽉참 or 해당 배치 시간의 크루가 없음)
        while i < len(available) and (len(dic[available[i]]) == m or available[i] < crew):
            i += 1
        if i == len(available):
            break
        crnt_time = available[i]
        dic[crnt_time].append(crew)


def solution(n, t, m, timetable):
    # 빨리 온 순서대로 정렬
    crews = sorted(map(str_to_time, timetable))
    dic = defaultdict(list)
    available = set_available_time(n, t)

    set_crews(dic, available, crews, m)
    last_time = available[-1]
    # 마지막 배차에 자리가 남았으면 막차시간에 맞추기
    if len(dic[last_time]) < m:
        return time_to_str(last_time)
    # 마지막 배차에 자리가 없으면 가장 마지막에 온 사람보다 1분 빨리 가기
    return time_to_str(max(dic[last_time]) - 1)
  • 구현
    • 시간 초로 바꾸기
    • 배차시간에 맞춰 줄 세우기
    • 마지막 배차에서 최대한 늦게 갈 수 있는 시간찾기

 

다른 사람이 작성한 코드

None

 

기억해야할 것

  • 문제가 풀고나니 간단해보이는데, 구현이 까다롭고 조건이 헷갈리는 문제였다