프로그래머스 - 기능개발(Lv. 2)

OQ·2022년 3월 2일
0

프로그래머스

목록 보기
5/33

문제 링크

풀이

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 클래스 작성하여 기능 구현 후 간편하게 풀이했다.
기본적인 배열 접근법만 잘 구상하면 풀기 쉬웠던 문제

profile
덕업일치 iOS 개발자

0개의 댓글