알고리즘/프로그래머스
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