개발조아

[프로그래머스] 셔틀버스 파이썬 본문

알고리즘/프로그래머스

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

개발조아 2021. 10. 6. 16:51
728x90

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17678

 

코딩테스트 연습 - [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의 시간을 분으로 바꾼 후 정렬하자.

 

9시에서 부터 시작하여 t 시간만큼 도착시간을 증가시키고 총 n번 수행하면서 사람들을 태우자.

 

이제 도착시간을 기준으로 timetable에서 사람들을 태우자.

이때 timetable에서 시간을 체크하여 출발시간보다 작거나 같다면 개수를 세주자.

그리고 인덱스는 0부터 시작하는데 위에서 세준 개수를 가지고 조정해가며 최대 m명까지 태울수 있으므로 현재 인덱스+m명까지 반복문을 돌리자.

만약 처음에 9시에 세사람이 도착했다면 다음번 셔틀의 도착시간을 체크할때는 3부터 시작하여 3+m까지 확인하면 된다.

이때 도착시간보다 크거나, timetable 범위를 벗어나면 반복문을 종료해주자.

 

위에서 세준 타는 사람을 기준으로 남은 사람을 조정해주자.

그리고 남은 사람이 0명이라면 콘이 탈 차례이다.

 

이때 다음 셔틀이 아직 남아 있다면 마지막 셔틀에 태우도록 하자.

그게 아니고 마지막 셔틀이라면

현재 셔틀에 탄 인원이 m명 보다 작다면 현재 셔틀의 도착시간으로 하면 된다.

 

그것도 아니고 다 탔다면 마지막 탄사람의 -1을 수행하면 된다.

나는 위에서 timetable의 인덱스와 개수를 세주었다.

그렇기 때문에 timetable[idx+cnt-1]-1을 하면 된다.

 

이제 마지막으로 모든 셔틀을 다 돌았는데 아직 대기하고 있는 사람들이 있을 경우이다.

한사람도 타지 못했다면 콘은 마지막 셔틀도착시간에 타면 된다.

 

그렇지 않을 때

이전 셔틀에 탄 사람의 수가 m과 같다면 마지막 탄사람의 시간-1을하면 되고

그게아니라면 도착시간에 타면 된다.

 

설명이 길지만 코드를 보면 금방 이해가 갈 것이다.

 

def solution(n, t, m, timetable):
    answer = ''
    for idx in range(len(timetable)):
        timetable[idx] = time_to_minute(timetable[idx])
        
    timetable.sort()
    start = 540
    idx = 0
    total = len(timetable)
    before = 0
    for bus in range(n):
        cnt = 0
        for time_idx in range(idx,idx+m):
            if time_idx >= len(timetable):
                break
            if timetable[time_idx] <= start:
                cnt += 1
            else:
                break
        total -= cnt
        before = cnt
        
        if total == 0:
            if bus < n-1:
                return minute_to_time(start+t*(n-1-bus))
            else:
                if cnt < m:
                    return minute_to_time(start)
                else:
                    return minute_to_time(timetable[idx+cnt-1]-1)
        start += t
        idx += cnt
    start -= t
    if idx == 0:
        return minute_to_time(start)
    else:
        if before == m:
            answer = timetable[idx-1]-1
            return minute_to_time(answer)
        else:
            return minute_to_time(start)
            
def minute_to_time(m):
    return '%02d:%02d'%(divmod(m,60))
def time_to_minute(t):
    return int(t.split(':')[0])*60+int(t.split(':')[1])
Comments