Algorithm/Simulation

[프로그래머스] 셔틀버스 (Python)

잘될거야아마두 2020. 11. 11. 14:28

코딩테스트 연습 - [1차] 셔틀버스 | 프로그래머스 (programmers.co.kr)

 

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

시뮬레이션 문제이다.

카카오에서는 이런 다중 조건을 만족시켜야 하는 문제가 꼭 출제되는 것 같다.

어떻게든 간단하게 풀어보려고 노력했으나... 아직 더 좋은 아이디어가 없으므로...

 

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