728x90
https://programmers.co.kr/learn/courses/30/lessons/42586
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
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 큰 수 만들기 (Swift) (0) | 2022.03.02 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 (Swift) (0) | 2022.03.02 |
[프로그래머스] 조이스틱 (C++) (0) | 2022.03.02 |
[프로그래머스] 위장 (Swift) (0) | 2022.03.02 |
[프로그래머스] 괄호 회전하기 (Swift) (스터디) (0) | 2022.02.27 |