본문 바로가기
코딩 테스트/프로그래머스

셔틀버스 (파이썬)

by 위그든씨 2023. 10. 9.

문제

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

 

프로그래머스

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

programmers.co.kr

솔루션

  • 셔틀의 도착시간은 곧 출발 시간 (9시 도착한 셔틀은 9시 출발) 
  • [예제 2번] 9시에 출발하는 셔틀이 최대 2명 탑승 가능하고 하루에 두번만 운행 할 때 크루원들이 [8시, 9시9분, 9시 10분] 에 줄선다면 (8시에 도착한 멤버는 9시 셔틀을 혼자 타고) (9시 9분,9시 10분에 도착한 멤버들은 9시 10분에 도착(출발)하는 셔틀)에 타게 된다. 그런데 하루에 두 번만 셔틀이 운행하므로 주인공은 9시 10분에 도착하는 멤버보다 1분 먼저 도착해있어야 셔틀에 탈 수 있다. 
  • [예제 6번] 하루에 10번 운행하는 셔틀이 있고 최대 45명을 태우는 버스는 모든 크루원들이 9시 셔틀을 타고 출발한다. 주인공은 제일 마지막에 출발하고 싶어하므로 다른 셔틀들은 안타고 18시에 도착(출발) 마지막 셔틀을 타게 된다. 
  • 이것을 논리화하면 한 셔틀의 탑승 총 인원이 탑승 제한보다 작을 경우에는 주인공은 버스가 도착(출발)하는 시간에 줄서면 되고, 셔틀에 탑승한 총 인원이 탑승 제한과 같다면 탑승 마지막 인원보다 1분 먼저 줄서면 된다. ( 탑승 한 총 인원이 제한 인원보다 큰 경우는 다음 셔틀을 타게 되므로 신경ㄴㄴ) 
  • 계산하기 편하게 (시*60+분)으로 표현

코드

def solution(n, t, m, asdasd):
    answer = 0
    timetable = []
    for i in asdasd:
        aa = i.split(":")
        s = int(aa[0])*60 + int(aa[1])
        timetable.append(s)
    timetable.sort()
    
    start = 540 //9시 출발
    lt = len(timetable)
	crew = 0		// 셔틀에 탑승 할 멤버 인덱스 
    for i in range(n):
        passenger = 0	// 이번에 도착(출발)한 셔틀의 탑승 한 인원 수
        while (passenger < m):
            if (crew < lt and timetable[crew] <= start):
                crew += 1
                passenger += 1
            else:
                break
        if (passenger == m):
            answer = timetable[crew-1]-1
        if (passenger < m):
            answer = start
        start += t
    a = str(answer//60) if answer//60 >= 10 else "0"+str(answer//60)
    b = str(answer % 60) if answer % 60 >= 10 else "0"+str(answer % 60)
    result = a+":"+b

    return result


print(solution(2, 10, 2, ["09:10", "09:09", "08:00"]))

'''
n : 셔틀 운행 횟수
t : 셔틀 운행 간격
m : 한 셔틀에 탈 수 있는 최대 크루 수
timetable: 크루원들 도착하는 시각
'''