셔틀버스 (Lv.3)

문제 링크

풀이

func solution(_ n:Int, _ t:Int, _ m:Int, _ timetable:[String]) -> String {
    var timetableInfo = timetable.map { $0.components(separatedBy: ":").map { Int($0)! } }
    timetableInfo.sort { $0[0] < $1[0] || ($0[0] == $1[0] && $0[1] < $1[1]) }   // 먼저 온 순서로 정렬
    var busTime = [9, 0]    // 시, 분
    
    var result = busTime
    
    for index in 0..<n {
        var remains = timetableInfo
        var throughput = m
        var lastMan = [0, 0]    // 마지막에 탄 사람의 정보
        for info in timetableInfo {
            if throughput > 0 && 
            ((busTime[0] > info[0]) || 
            (busTime[0] == info[0] && busTime[1] >= info[1])) { // 태울 수 있다면
                throughput -= 1
                lastMan = remains.removeFirst()
            } else {
                break
            }
        }
        
        timetableInfo = remains
        if throughput > 0 { // 버스 자리가 널널하다면 그냥 탄다.
            result = busTime
        } else {    // 버스 자리 없을경우 마지막 탄 사람보다 1분 먼저 탄다.
            let minute = lastMan[1] - 1
            if minute >= 0 {
                result[0] = lastMan[0]
                result[1] = minute
            } else {
                result[0] = lastMan[0] - 1
                result[1] = 59
            }
        }
        
        let minute = busTime[1] + t
        if minute >= 60 {
            busTime[0] += 1
            busTime[1] = minute - 60
        } else {
            busTime[1] = minute
        }
    }
    
    return String(format: "%02d:%02d", result[0], result[1])
}

후기

레벨에 비해서 쉬웠던 문제.
시간 기준으로 처리량 체크하는 코딩테스트 단골 문제 형식이었다.
딱히 알고리즘이나 특이한 예외 생각할 것 없이
그냥 풀면 되는 문제.

좋은 웹페이지 즐겨찾기