2026-05-21 23:15:22 +09:00

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
}