Closed
Description
💬 문제
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)
}