1 분 소요

사용 언어: Python3, Java

문제

[1차] 셔틀버스

풀이

나의 풀이

def solution(n, t, m, timetable):
    def timeToMin(str):
        hh, mm = map(int, str.split(':'))
        return hh * 60 + mm
    def minToTime(n):
        return '{0:02d}'.format(n//60) + ':' + '{0:02d}'.format(n%60)
    
    for i in range(len(timetable)):
        timetable[i] = timeToMin(timetable[i])
    timetable.sort()
    
    busTime = [] # 버스가 도착하는 시간
    for i in range(n):
        busTime.append(540 + i * t)
        
    is_space, last_ride_mm = True, 0 # 버스 자리 남았는지, 마지막 크루가 버스에 탄 시간
    isRide = [0] * len(timetable) # timetable에 있는 크루들이 버스 탔는지 체크
    
    for x in busTime: # 모든 버스 순회하면 is_space, last_ride_mm은 "마지막 버스" 기준이 된다
        cnt = 0 # 탑승 인원
        for i in range(len(timetable)):
            if isRide[i]: # 이미 탑승한 사람은 패스
                continue
            if not is_space: # 만차라면 패스
                continue
            if timetable[i] <= x: # 버스 도착 전에 왔으면 탑승
                isRide[i] = 1 # 탑승
                cnt += 1
                if cnt >= m: # 만차
                    is_space = False
                last_ride_mm = timetable[i]
    
    ans = 0
    if is_space: # 자리가 남았다면 콘은 버스 도착 시간까지만 오면 된다
        ans = busTime[-1]
    else: # 자리가 안남았다면 마지막 크루가 탄 시간보다 1분 일찍 와야한다
        ans = last_ride_mm - 1
        
    return minToTime(ans)
  • 테스트 케이스: 성공
  • 제출 결과: 실패

다른 풀이

참고

 def solution(n, t, m, timetable):
    def timeToMin(str):
        hh, mm = map(int, str.split(':'))
        return hh * 60 + mm
    def minToTime(n):
        return '{0:02d}'.format(n//60) + ':' + '{0:02d}'.format(n%60)
    
    # 크루 도착 시각 리스트
    crewTime = [timeToMin(time) for time in timetable]
    crewTime.sort()
    
    # 버스 도착 시각 리스트
    busTime = [540 + i * t for i in range(n)]

    idx = 0 # 다음에 버스에 오를 크루의 인덱스
    answer = 0
    for x in busTime:
        cnt = 0   # 버스에 타는 크루 수
        while cnt < m and idx < len(crewTime) and crewTime[idx] <= x:
            idx += 1
            cnt += 1
        if cnt < m: # 자리가 남았다면 콘은 버스 도착 시간까지만 오면 된다
            answer = x
        else: # 자리가 안남았다면 마지막 크루가 탄 시간보다 1분 일찍 와야한다
            answer = crewTime[idx-1] - 1 # idx는 +1 된 상태이기 때문에 -1로 다시 돌리기

    return minToTime(answer)
  • 테스트 케이스: 통과
  • 제출 결과: 성공

스크린샷 2023-07-05 오후 4 53 55



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기