코딩테스트 연습 - [1차] 셔틀버스 | 프로그래머스 (programmers.co.kr)
시뮬레이션 문제이다.
카카오에서는 이런 다중 조건을 만족시켜야 하는 문제가 꼭 출제되는 것 같다.
어떻게든 간단하게 풀어보려고 노력했으나... 아직 더 좋은 아이디어가 없으므로...
timetable에 저장된 승객들의 도착 시간과 버스 도착 시간을 각각 deque에 넣었다.
두 개의 큐가 모두 빌 때까지 schecule이라는 스택에 승객이나 버스가 떠나는 순서대로 쌓았다.
그리고 맨 마지막 버스를 기준으로 좌석이 남았으면 마지막 버스의 시간을,
좌석이 없으면 그 앞 승객(마지막 승객)보다 1분 빠른 시간을 리턴했다.
from collections import deque
def solution(n, t, m, timetable):
# 시간 변환 및 정렬
timetable = [int(time[: 2]) * 60 + int(time[3: ]) for time in timetable]
timetable.sort()
timeq = deque(timetable)
# 이용 가능한 버스 목록
busq = deque([[9 * 60 + t * i, m] for i in range(n)])
# 대기자와 버스를 떠나는 순서대로 쌓음
schedule = []
while timeq or busq:
# 대기자가 남았으면
if timeq:
cur_person = timeq[0]
# 대기자가 없으면 남은 버스 뒤에 붙이고 break
else:
schedule.extend(busq)
break
# 버스가 남았으면
if busq:
cur_bus = busq[0]
# 버스가 없으면 남은 대기자 뒤에 붙이고 break
else:
schedule.extend(timeq)
break
# 현재 대기자가 버스보다 빨리 와 있었으면
# 버스에 타고 좌석 한 개 줄임
if cur_person <= cur_bus[0]:
schedule.append(timeq.popleft())
cur_bus[1] -= 1
# 버스보다 늦게 왔으면
# 버스 떠남
else:
schedule.append(busq.popleft())
# 버스 좌석이 다 차면
# 버스 떠남
if cur_bus[1] == 0:
schedule.append(busq.popleft())
for i in range(len(schedule) - 1, -1, -1):
# 가장 마지막 버스를 기준으로
if type(schedule[i]) is list:
# 좌석이 남았으면
# 마지막 버스에 탑승
if schedule[i][1] > 0:
return '{:02}:{:02}'.format(schedule[i][0] // 60, schedule[i][0] % 60)
# 좌석이 없으면
# 마지막 대기자 보다 1분 빨리 오기
else:
return '{:02}:{:02}'.format((schedule[i - 1] - 1) // 60, (schedule[i - 1] - 1) % 60)
'Algorithm > Simulation' 카테고리의 다른 글
[프로그래머스 Programmers] 괄호 변환 (Python) (0) | 2021.03.26 |
---|---|
[백준 BOJ] 17281번 ⚾ (Python) (0) | 2021.03.19 |