본문 바로가기
알고리즘 문제풀이

[프로그래머스] 기능개발 (Swift)

by SiO2whocode 2022. 3. 2.
728x90

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

level2, 스택

 

진행 상황, 속도가 아래와 같이 주어진다. 이때 속도는 하루에 할 수 있는 작업의 양

[93, 30, 55] [1, 30, 5]

진행 상황 배열에서 앞쪽에 있는 작업부터 배포될 수 있고, 뒤에 있는 작업은 작업이 먼저 완료되어도 그 앞의 작업들이 배포되기 전까지는 배포될 수 없다.

 

접근방법

1. 각 작업 마다 필요한 작업일수를 구한다. 

Int(ceil((Double(100-progress)/Double(speeds[index]))))

남은 작업량 / 속도 -> 소수점 올림

2. 필요한 작업일수를 담은 배열 datesNeededList 를 순회하면서 이번 배포에 배포할 수 있는 작업의 수를 카운팅하며 이번 배포에 배포할 수 없는 작업이 등장할 때까지 다음 인덱스를 방문한다. 

(첫번째 배포일은 첫번째 작업이 배포하는데 필요한 일수이다.)

3. 이번배포에 필요한 일수보다 큰 작업을 만나면 배포 갯수를 담은 배열에 지금까지 카운팅한 배포 가능 작업의 개수를 append하고, 카운트는 다시 1로 초기화한다. 그리고 현재 인덱스가 가리키는 작업에 필요한 일수를 현재 배포일수에 저장한다.

4. 배열이 끝날때까지 이 2,3의 과정을 반복한다.

5. 그리고 마지막에 반복문을 종료하고 나오면 카운트를 마지막으로 결과 배열에 append해줘야 햔다. 

 

소스코드

import Foundation

func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
    var answer:[Int] = []
    var datesNeededList:[Int] = []
    
    for (index,progress) in progresses.enumerated() {
        let datesNeeded = Int(ceil((Double(100-progress)/Double(speeds[index]))))
        datesNeededList.append(datesNeeded)
    }
    
    var currentReleaseDate:Int = datesNeededList[0]
    var numOfRelease:Int = 0
    for datesNeeded in datesNeededList {
        if datesNeeded <= currentReleaseDate {
            numOfRelease += 1
        } else {
            answer.append(numOfRelease)
            numOfRelease = 1
            currentReleaseDate = datesNeeded
        }
    }
    answer.append(numOfRelease)

    return answer
}
728x90