문제 설명:
셔틀버스
카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.
이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.
셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.
셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.
일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.
단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
문제 예시:
| n | t | m | timetable | answer |
| 1 | 1 | 5 | ["08:00", "08:01", "08:02", "08:03"] | "09:00" |
| 2 | 10 | 2 | ["09:10", "09:09", "08:00"] | "09:09" |
| 2 | 1 | 2 | ["09:00", "09:00", "09:00", "09:00"] | "08:59" |
| 1 | 1 | 5 | ["00:01", "00:01", "00:01", "00:01", "00:01"] | "00:00" |
| 1 | 1 | 1 | ["23:59"] | "09:00" |
| 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" |
해설은 다음 링크를 참조 http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
문제 해설:
def addTime(t1, t):
nxtMin = int(t1[3:]) + t
if nxtMin >= 60:
nxtHour = int(t1[:2])+(nxtMin//60)
if nxtHour < 10:
nxtHour = "0" + str(nxtHour)
else:
nxtHour = str(nxtHour)
nxtMin -= 60 * (nxtMin//60)
if nxtMin < 10:
nxtMin = "0" + str(nxtMin)
else:
nxtMin = str(nxtMin)
return nxtHour+":"+nxtMin
elif nxtMin < 0:
nxtHour = int(t1[:2]) - 1
nxtMin = 60 + nxtMin
if nxtHour < 10:
nxtHour = "0" + str(nxtHour)
elif nxtMin < 10:
nxtMin = "0" + str(nxtMin)
return str(nxtHour)+":"+str(nxtMin)
else:
nxtHour = t1[:2]
if nxtMin < 10:
nxtMin = "0" + str(nxtMin)
else:
nxtMin = str(nxtMin)
return nxtHour+":"+nxtMin
def compareTime(t1, t2):
"""
t1이 크면 True
그렇지 않으면 False
"""
if t1[:2] != t2[:2]:
return int(t1[:2]) > int(t2[:2])
else:
return int(t1[3:]) > int(t2[3:])
def solution(n, t, m, timetable):
answer = ''
timetable.sort()
start = "09:00"
lst = []
[lst.append(addTime(start, t*i)) for i in range(n)]
idx = 0
for i in range(n):
cnt = 0
while idx < len(timetable) and cnt < m:
if compareTime(lst[i], timetable[idx]) or lst[i] == timetable[idx]:
idx += 1
cnt += 1
else:
break
if i == n-1:
if cnt < m:
return lst[i]
else:
last = timetable[idx-1]
return addTime(last, -1)
우선 들어오는 시간 형식이 "HH:MM"의 string 형식이라 비교하고 더하는 함수를 두 개 만들었다.
이후에, timetable이 sort가 된다 (string 또한 sort가 된다, 따라서 우연치 않게 format이 이상해도 sorting이 가능했다)
그 이후 가능한 후보 시간대를 만든 후에 n만큼 돌린다
돌리면서 cnt를 재는데 이는
1. 다음 배차의 유무
2. 남아있는 자리의 유무
이 두가지를 동시에 비교하면서 다음으로 나아간다
만약에 모든 조건에 부합한다면 넘어가고 맞지 않는다면 멈춰서 값을 뱉어내는 형식이다.
최종으로 시간이 나온다면
가장 마지막의 -1분이므로 값을 주고 (후보 시간대에 없다면 or 자리가 없어서 먼저 가야 한다면)
그렇지 않다면 후보 시간대에서 -1분을 준다
다른 분들도 다양한 방식으로 풀었는데 핵심은 string을 어떻게 다룰 것이냐
그리고 최종 값을 도출하기 위한 조건문 설정이 핵심인 것 같다.
'코테' 카테고리의 다른 글
| 프로그래머스 - 최적의 행렬 곱셈 [연습문제 (0) | 2026.01.29 |
|---|---|
| 프로그래머스 - 최고의 집합 [연습 문제] (0) | 2026.01.28 |
| 프로그래머스 - 리코쳇 로봇 [연습문제] (0) | 2026.01.26 |
| 프로그래머스 - 거스름돈 [연습문제] (0) | 2026.01.26 |
| 프로그래머스 - 행렬의 곱셈 [연습문제] (0) | 2026.01.25 |