import Foundation
func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
let manager = JobManager(progresses, speeds)
var countRecords: [Int] = []
while true {
if manager.update() { // 업데이트 후 맨앞 작업이 완료되었을 경우
countRecords.append(manager.removeComplete()) // 업데이트 된것들을 처리하고 완료숫자를 기록한다.
}
if manager.isEmpty { // 더 작업할 게 없다면 루프 탈출
break
}
}
return countRecords
}
// 배열의 인덱스에 접근할 수 있는 특별한 큐
class JobManager {
private var stack: [Int]
private var speeds: [Int]
init(_ stack: [Int], _ speeds:[Int]) {
self.stack = stack
self.speeds = speeds
}
var isEmpty: Bool {
return stack.isEmpty
}
// 맨앞 작업이 완료되면 true 반환
func update() -> Bool {
var isFinish = false
for (index, progress) in stack.enumerated() {
let output = progress + speeds[index]
stack[index] = output
if index == 0, output > 99 { // 맨앞 작업이 완료 되었다면
isFinish = true
}
}
return isFinish
}
// 완료된 작업들을 스택에서 빼고 완료된 개수를 리턴한다.
func removeComplete() -> Int {
var count = 0
for progress in stack {
if progress > 99 {
count += 1
stack.removeFirst()
speeds.removeFirst()
} else {
break
}
}
return count
}
}
JobManager 클래스 작성하여 기능 구현 후 간편하게 풀이했다.
기본적인 배열 접근법만 잘 구상하면 풀기 쉬웠던 문제