Skip to content

[Algorithm] [1차] 셔틀버스 #194

Closed
@hwangJi-dev

Description

@hwangJi-dev

💬 문제

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


💬 Idea

  • timetable을 시간순으로 내림차순 정렬한 뒤 2359를 필터링한다.
  • n만큼 돌면서 startTime에 t만큼을 더하여 셔틀의 출발 시간을 갱신한다.
    • 각 운행 당 태울 수 있는 최대 크루 수만큼 크루를 태우기 위해 m이 0이 될 때까지 timeTable을 popLast한다.
    • 이 때 가장 빨리 태워야하는(가장 먼저 줄을 선) 크루의 줄 선 시각이 현재 시각보다 늦을 경우 → 다시 timeTable에 tada를 append하고 반복문을 멈춘다.
  • 만약 현재가 마지막 운행 셔틀이라면 → 콘이 탈 수 있는 가장 늦은 도착 시간을 구한다
    • m이 남은 경우 → 크루가 줄을 선 가장 마지막 시각에 콘이 마지막으로 줄을 서면 탈 수 있다.
    • m이 남지 않은 경우 → 크루가 줄을 선 가장 마지막 시각에 콘이 마지막으로 줄을 서면 콘이 타지 못하고 버스가 떠나버리므로 → 크루가 줄을 선 가장 마지막 시각 - 1에 콘이 탑승해야 안전하게 도착할 수 있다!

💬 풀이

import Foundation

func solution(_ n:Int, _ t:Int, _ m:Int, _ timetable:[String]) -> String {
    var startTime = 900
    var cornTime = startTime
    var timetable = timetable.map({ Int($0.split(separator: ":").joined())! }).filter({ $0 != 2359 }).sorted(by: >)
    var tada = 0
    
    for i in 1...n {
        var m = m
        
        while m > 0 && !timetable.isEmpty {
            tada = timetable.popLast()!

            if tada <= startTime {
                m -= 1
            } else {
                timetable.append(tada)
                tada = startTime
                break
            }
        }
        
        if n == i {
            if m > 0 {
                cornTime = startTime > tada ? startTime : tada
            } else {
                cornTime = tada - 1
                if cornTime % 100 >= 60 {
                    cornTime -= 40
                }
            }
        }
        
        startTime += t
        
        if startTime % 100 >= 60 {
            startTime += 40
        }
    }
    
    return String(format: "%02d:%02d", cornTime / 100, cornTime % 100)
}

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions