54 lines
1.6 KiB
Swift
54 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
func solution(_ plans: [[String]]) -> [String] {
|
|
var tasks: [(name: String, start: Int, playTime: Int)] = []
|
|
|
|
func timeToMinutes(_ timeStr: String) -> Int {
|
|
let components = timeStr.split(separator: ":").map { Int($0)! }
|
|
return components[0] * 60 + components[1]
|
|
}
|
|
|
|
for plan in plans {
|
|
let name = plan[0]
|
|
let start = timeToMinutes(plan[1])
|
|
let playTime = Int(plan[2])!
|
|
tasks.append((name, start, playTime))
|
|
}
|
|
|
|
tasks.sort { $0.start < $1.start }
|
|
|
|
var answer: [String] = []
|
|
var stack: [(name: String, remainingTime: Int)] = []
|
|
|
|
for i in 0..<(tasks.count - 1) {
|
|
let currentTask = tasks[i]
|
|
let nextTask = tasks[i + 1]
|
|
|
|
var availableTime = nextTask.start - currentTask.start
|
|
stack.append((currentTask.name, currentTask.playTime))
|
|
|
|
while availableTime > 0 && !stack.isEmpty {
|
|
let lastIndex = stack.count - 1
|
|
var pausedTask = stack[lastIndex]
|
|
|
|
if pausedTask.remainingTime <= availableTime {
|
|
answer.append(pausedTask.name)
|
|
availableTime -= pausedTask.remainingTime
|
|
stack.removeLast()
|
|
} else {
|
|
pausedTask.remainingTime -= availableTime
|
|
stack[lastIndex] = pausedTask
|
|
availableTime = 0
|
|
}
|
|
}
|
|
}
|
|
|
|
answer.append(tasks.last!.name)
|
|
|
|
while !stack.isEmpty {
|
|
answer.append(stack.removeLast().name)
|
|
}
|
|
|
|
return answer
|
|
}
|