문자열 파싱을 통해 시간을 정수로 만든 뒤 대기열에 도착하는 순서대로 정렬하자. 버스 시간표에 따라 아무런 이상이 없을 경우 버스에 타게 되는 순서를 배열을 통해 카운트, "마지막 버스"에 타게 될 경우를 얻어낼 수 있다. 마지막 버스에 자리가 남았다면 버스 도착 시간에, 자리가 없다면 마지막 버스에 마지막으로 도착하는 사람보다 1분 더 빨리 도착하기만 하면 된다.
func solution(_ n:Int, _ t:Int, _ m:Int, _ timetable:[String]) -> String {
var timetable = timetable.map{convertTime($0)}.sorted(by: <)
var start = 0
var end = timetable.count - 1
var busTime = convertTime("09:00") - t
var busMembers = [[Int]]()
var busMember = [Int]()
var busTimetable = [Int]()
for _ in 0..<n {
busTime += t
busTimetable.append(busTime)
busMember = []
if start <= end {
for crew in start...end {
let time = timetable[crew]
if time <= busTime {
start += 1
busMember.append(time)
if busMember.count == m {
break
}
}
}
}
busMembers.append(busMember)
}
busMembers.reverse()
busTimetable.reverse()
for idx in 0..<busMembers.count {
let bus = busMembers[idx]
let limitTime = busTimetable[idx]
if bus.count < m {
let answer = convertTime(limitTime)
return answer
} else {
let last = bus.last!
let answer = convertTime(last - 1)
return answer
}
}
return ""
}
func convertTime(_ time: Int) -> String {
let hour = time / 60
let minute = time % 60
let hourString = hour < 10 ? "0" + String(hour) : String(hour)
let minuteString = minute < 10 ? "0" + String(minute) : String(minute)
return hourString + ":" + minuteString
}
func convertTime(_ time: String) -> Int {
let time = time.split(separator: ":").map{Int(String($0))!}
let (hour, minute) = (time[0], time[1])
return hour * 60 + minute
}