import Foundation
func solution(_ plans:[[String]]) -> [String] {
let planList = plans.sorted(by: { $0[1] < $1[1] })
let names: [String] = planList.map { String($0[0]) }
let starts: [(Int)] = planList.map {
let components = $0[1].split(separator: ":").map { Int($0)! }
return (components[0]*60 + components[1])
}
var playtimes: [Int] = planList.map { Int($0[2])! }
var saveJobs: [Int] = []
var currentIndex = 0
var currentTime = playtimes[0]
var answer: [String] = []
while currentIndex < planList.count || !saveJobs.isEmpty {
// 만약 아직 다 안돌았고 // 현재 시간이 과제를 할 수 있는 시간이라면 과제를 한다
if currentIndex < planList.count && starts[currentIndex] <= currentTime {
let availableTime = (currentIndex + 1 < planList.count) ? starts[currentIndex + 1] - currentTime : Int.max
// 과제시간이 가용시간보다 적을 경우 과제를 햐버리고 끝내버린다
if playtimes[currentIndex] <= availableTime {
currentTime += playtimes[currentIndex]
answer.append(names[currentIndex])
playtimes[currentIndex] = 0
} else { // 만약 과제를 다 못하는 시간이라면
playtimes[currentIndex] -= availableTime // 작업을 가용시간만큼 해버리고
currentTime += availableTime
saveJobs.append(currentIndex) // 나중에 해야할 과제로 저장해둔다
}
currentIndex += 1
} else if !saveJobs.isEmpty { // 만약 해야할 과제가 존재한다면
let lastPausedIndex = saveJobs.removeLast() // 마지막 과제부터 한다
let availableTime = (currentIndex < planList.count) ? starts[currentIndex] - currentTime : Int.max
if playtimes[lastPausedIndex] <= availableTime {
currentTime += playtimes[lastPausedIndex]
answer.append(names[lastPausedIndex])
playtimes[lastPausedIndex] = 0
} else {
playtimes[lastPausedIndex] -= availableTime
currentTime += availableTime
saveJobs.append(lastPausedIndex)
}
} else {
currentTime = starts[currentIndex]
}
}
return answer
}