본문 바로가기

알고리즘/Lv. 3

프로그래머스 17678 셔틀버스 파이썬 풀이

728x90

난이도 : Lv. 3

풀이일 : 2501201

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

 

프로그래머스

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

programmers.co.kr


문제


아이디어

  • 전체 버스 시간을 숫자로 변환해서 쉽게 비교하자
  • 각 버스 시간에 버스를 타고 간 크루의 인덱스를 저장하자
  • 막차에 자리가 있다면, 막차 시간에 도착하자
  • 막차에 자리가 없다면 마지막 사람보다 1분 먼저 도착하자

코드

def solution(n, t, m, timetable):
    bus, now = 0, 540 - t
    crew = 0 # 인덱스로 몇 번째 도착한 크루 버스 탔는지 기록
    lastseat = True
    
    # timetable 숫자 변환 및 정렬
    timetable = [int(time[:2]) * 60 + int(time[3:]) for time in timetable]
    timetable.sort()
    
    while bus < n: # 각 버스에 타는 크루 구하기
        now += t
        num = 0
        while crew + num < len(timetable) and num < m:
            if timetable[crew + num] > now: # 현재 버스 떠나고 온 사람 발견 -> 중지
                break
            
            num += 1 
            if bus + 1 == n and num == m: # 막차에 자리 없음
                lastseat = False
        
        crew += num
        bus += 1
    
    # 막차에 자리 있다면 막차, 자리 없다면 막차 탄 마지막 사람보다 1분 빨리 도착
    answer = now if lastseat else timetable[crew - 1] - 1
        
    return f'{str(answer // 60).zfill(2)}:{str(answer % 60).zfill(2)}'
  • lastseat : 막차에 자리가 있는지 확인
  • timetable : 모두 숫자로 변환해 9시인 540부터 각 셔틀버스 도착시간과 비교한다. 비교를 위한 정렬 필요
  • while bus < n  : 각 버스에 타는 크루를 구해 탄 크루의 인덱스를 crew로 저장
  • while crew + num < len(timetable) and num < m : 현재 버스에 탈 수 있는 사람들 탑승여부 판단
  • if timetable[crew + num] > now : 현재 버스 출발 시간보다 도착시간이 늦은 사람을 발견했으므로 중단 조건
  • 막차면서, 탈 수 있는 사람이 다 탔으면 막차에 자리가 없다.
  • 막차에 자리가 있다면 막차 시간 출력, 없다면 마지막 사람보다 1분 빨리 도착

제출 결과


느낀점

  • zfill() 오랜만에 써봐서 헤맸다.
  • 어렵지도 않은데 왜 이렇게 오래풀었지 천천히 꼼꼼하게 조건을 보면서 로직을 세우고 코드를 짜자
  • 그리고 코드가 깔끔하지 않아서 마음에 안 든다. 다음에 고쳐봐야지