본문 바로가기

Coding test

[ 프로그래머스/ 파이썬 ] [1차] 셔틀버스

🔗 Link

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🧩 Source Code

from collections import deque

def solution(n, t, m, timetable):
    answer = ''
    bus_depart_time_table = get_bus_depart_time_table(n,t)
    minute_table = sorted([ change_time_to_minute(t) for t in timetable])
    queue = deque(minute_table)  
    last_time = []
    for idx, bus_time in enumerate(bus_depart_time_table):
        cnt = m
        while queue and queue[0] <= bus_time and cnt > 0:
            a = queue.popleft()
            if idx == n - 1 :
                last_time.append(a)
            cnt -= 1
    # 콘이 다른 사람들과 함께 막차를 탈 수 있는 경우
    if len(last_time) < m :
        answer = change_minute_to_time(bus_time)
	# 아쉽지만 다른 사람 한명은 제껴야 하는 경우
    else :
        answer = change_minute_to_time(last_time[-1]-1)
    return answer

# 버스가 출발하는 시간을 구하는 함수
def get_bus_depart_time_table(n, t):
    time_table = [540]
    for i in range (n-1):
        time_table.append(540 + (i+1) * int(t))
    return time_table

def change_time_to_minute(time):
    tmp = time.split(':')
    return int(tmp[0]) * 60 + int(tmp[1])

def change_minute_to_time(minute):
    h,m = minute // 60 , minute % 60
    return f'{h:02d}:{m:02d}'

 

📝 Commentary

소요시간 : 65분

 

로직은 다음과 같다

1. 각 버스의 출발 시간을 구함 -> 이때 09:00 으로 되어 있는 형태는 모두 540과 같이 분으로 바꿔준다.

그렇게 되면 540, 560, 580 이렇게 출발 시간이 분단위로 구해진다.

 

2. 크루들이 도착해있는 순서대로 분으로 변환하여 정렬한 뒤 큐에 넣어준다.

09:10 , 09:09, 08:00 -> 480, 549, 550

 

3. 1번에서 구한 버스의 각 출발 시간과 버스에 들어갈 수 있는 용량을 기준으로 큐에서 빼준다.

while queue and queue[0] <= bus_time and cnt > 0:
    a = queue.popleft()

 

4. 이렇게 한 다음 맨 마지막에 막차를 타는 경우가 구하고자 하는 부분이 된다.

 

이제 if문으로 분기처리를 해줘야한다.

a. true : 막차의 용량보다 타있는 사람이 적은 경우

b. false : 막차의 용량만큼 꽉 타있는 경우

 

a. 이 경우 막차 시간대에 딱 타면 된다.

막차 : 550분

용량 : 2명

타있는 사람 : 540

-> 콘이는 550분에 와서 타면 됨

 

b. 이 경우 한명을 제끼고 버스를 타야한다.

막차 : 550분

용량 : 2명

남은 사람 : 549, 550

이렇게 남았을때 콘이는 남은 사람 550을 제끼고 549로 도착을 해서 타면 된다.

어차피 막차에는 용량만큼 타있기 때문에 맨 마지막 사람보다만 빠르게 타면 된다.

 

b-1. 549가 여러개 인 경우는 어떻게 하나요?

막차 : 550분

용량 : 2명

남은 사람 : 549, 549

이 또한 마찬가지로 처리가 되므로 상관 없다.