Programing/프로그래머스 오답노트

[프로그래머스] [1차]셔틀버스

yooom 2023. 10. 9. 20:51
문제 설명
셔틀버스 카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 '크루'라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다. 이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자. 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다. 일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라. 단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.
입력 형식 셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다. 0 < n ≦ 10 0 < t ≦ 60 0 < m ≦ 45 timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다. 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.
출력 형식 콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.

 

풀이
def solution(n, t, m, timetable):
    import datetime as dt
    from collections import deque

    table = deque(sorted([dt.datetime(2022, 1, 1, int(i[:2]), int(i[3:])) for i in timetable]))
    que = deque()

    # n대의 버스
    for i in range(n): 

        # 도착시각
        arrive = dt.datetime(2022, 1, 1, 9, 0) + (i * dt.timedelta(minutes = t)) 

        # 버스보다 빨리 도착하는 크루는 줄에 추가
        while table:
            if table[0] <= arrive:
                que.append(table.popleft())
            else:
                break                                

        # 마지막 버스인 경우 탈 수 있는 순위 확인
        if i == n - 1:
            print('마지막 버스를 기다리는 사람들 =', que)
            # 마지막 버스를 기다리고 있는 사람이 정원 미만이면 마지막 버스 출발시각에 줄서기
            if len(que) < m:
                return arrive.strftime('%H:%M')                
            # 마지막 버스를 기다리고 있는 사람이 정원 이상이면 탈 수 있는 순위 체크 
            else:
                lastman = que[m - 1] # 얘보다 1분 일찍 줄서기
                answer = lastman + dt.timedelta(minutes = -1)
                return answer.strftime('%H:%M')

        # m 명 출발
        cnt = 0
        while que and cnt < m:
            que.popleft()
            cnt += 1

 

 

def solution(n, t, m, timetable):
    timetable.sort()
    bus_table = []

    last = make_time(540 + (n-1) * t)
    if timetable[0] > last:
        return last

    for i in range(n):
        bus_table.append(make_time(540 + i*t))

    print("버스 시간표:", bus_table)
    print("사람 시간표:", timetable)
    for j in range(len(bus_table)):
        p = 0
        people_on_bus = []              #이번 버스에 탄 사람들 목록
        for i in range(len(timetable)):
            if timetable[i] != "탑승":
                if m == p:
                    print("탑승인원 초과, 다음버스")
                    break
                if timetable[i] <= bus_table[j]:
                    print(bus_table[j], "시에,", timetable[i], "에 온 사람이 탑승")
                    people_on_bus.append(timetable[i])
                    timetable[i] = "탑승"
                    p += 1
                    continue
                else:
                    print("시간 초과, 다음버스")
                    p = 0
                    break

    if len(people_on_bus) != m:
        return bus_table[j]
    else:
        return make_time(make_num(max(people_on_bus))-1)

def make_time(num):                 #숫자를 시간으로
    hour = str(num // 60)
    min = str(num % 60)
    if int(hour) < 10:
        hour = "0" + hour
    if int(min) < 10:
        min = "0" + min
    return hour + ":" + min

def make_num(time):                 #시간을 숫자로(분 단위)
    timelist = time.split(":")
    return int(timelist[0]) * 60 + int(timelist[1])
출처

https://school.programmers.co.kr/learn/courses/30/lessons/17678

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90