본문 바로가기
Programming/Programmers

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

by 데이터현 2021. 10. 30.

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

나의 풀이

그다지 잘 푼 느낌이 아니다. 그냥 알고리즘 짜고 그대로 구현하긴 했다. 더 깔끔하게 풀 수 있을 것 같은데 아직 많이 부족하다ㅠ

 

알고리즘 순서는

1. 셔틀버스 도착 시간 순서로 dict 초기화하고

2. 정렬된 timetable을 바탕으로  도착한 셔틀버스에  탑승 가능 인원 수와 도착 시간을 고려해서 추가해준다.

3. 완성된 dict를 바탕으로 주인공이 어디 들어갈지 체크하는데

    만약 셔틀에 빈자리가 있다면, 셔틀 도착시간이 가장 늦게 나가는 시간이므로 그렇게 초기화해주고

    셔틀이 꽉 차있다면 현재 셔틀에서 가장 마지막에 탄 사람 시간 -1분으로 변경해준다.

 

def solution(n, t, m, timetable):
    shuttle_time = '09:00'
    shuttle_info=dict()
    timetable.sort()
    for i in range(n):
        hh,mm=map(int,shuttle_time.split(':'))
        mm += i*t
        hh += mm//60
        mm = mm%60
        if hh//10 == 0:
            hh = '0'+str(hh)
        if mm//10 == 0:
            mm = '0'+str(mm)
        sh = str(hh)+':'+str(mm)
        shuttle_info[sh] = []
    for t in timetable:
        for shuttle in shuttle_info:
            if len(shuttle_info[shuttle]) < m:
                if shuttle >= t:
                    shuttle_info[shuttle].append(t)
                    break
    has_setting = False
    for shuttle in shuttle_info:
        if len(shuttle_info[shuttle]) ==m: # 자리가 꽉 차있는 경우
            if has_setting: # 앞 셔틀에 세팅이 되어 있는 경우
                pass
            else: # 앞 셔틀에 세팅이 안되어 있는 경우
                hh,mm=map(int,shuttle_info[shuttle][-1].split(':')) # 제일 뒷좌석 시간 불러옴
                if mm==0:
                    mm=59
                    hh-=1
                else:
                    mm-=1
                if hh//10 == 0:
                    hh = '0'+str(hh)
                if mm//10 == 0:
                    mm = '0'+str(mm)
                answer = str(hh)+':'+str(mm)
        else: #자리가 비어있는 경우
            answer = shuttle
    return answer

댓글