알고리즘/프로그래머스

2018 카카오 블라인드 코딩테스트 - 셔틀버스, 파이썬

그레고리력 2021. 3. 5. 23:10

1. 문제

프로그래머스 문제 링크

 

코딩테스트 연습 - [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

2. 풀이

 

- 예제를 보면 알 수 있지만 관건은 마지막 버스가 비어서 간다면 마지막 버스 출발시간에, 마지막 꽉 차서 간다면 마지막 버스에 마지막으로 탄 사람보다 1분 일찍 도착하면 된다. 

- 우선 timetable 배열이 문자열로 주어지기 때문에 시간을 모두 분으로 바꾸어주고 답을 구하기 위해 분을 문자열로 바꾸어주는 함수를 작성하였다.(처음에 초인줄 알고 함수명이 이상함)

- pop()으로 빼기 위해 reverse 정렬을 해주었는데 그냥 큐로 빼도 된다. 실수다. 

- 어쨌든 풀이의 핵심은 마지막버스의 마지막자리이므로 bustable에 버스 출발시간을 모두 넣고 while문을 돌려준다. 

- 이 때 하나의 버스마다 출발시간 전에 도착한 사람들을 m보다 작다면 seat로 빼준다. 

- 따라서 while문이 끝난 후 seat 배열을 살펴본 후 배열 길이가 m이라면 마지막보다 1분 빠르게, m보다 작다면 마지막 버스 출발시간에 도착하면 된다. 

 

3. 코드

def min_sec(string) :
    m, s = string.split(":")[0], string.split(":")[1]
    return int(m)*60 + int(s)

def sec_min(sec) :
    m = sec // 60
    s = sec % 60
    if m < 10 :
        m = "0" + str(m)
    else :
        m = str(m)
    if s < 10 :
        s = "0" + str(s)
    else :
        s = str(s)
    return m + ":" + s


def solution(n, t, m, timetable):
    answer = ''
    stack = []
    for time in timetable :
        stack.append(min_sec(time))
    stack.sort(reverse = True)
    bustable = []
    for i in range(1, n+1) :
        bustable.append((i-1)*t + min_sec("09:00"))
    bustable.sort(reverse = True)
    while bustable :
        bus = bustable.pop()
        seat = []
        while stack and bus >= stack[-1] and len(seat) < m :
            seat += [stack.pop()]
    if len(seat) == m :
        answer = sec_min(seat[-1] - 1)
    else :
        answer = sec_min(bus)
    return answer