https://school.programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스 팀에서는 기능 개선 작업을 수행 중이다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있다
각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞의 기능보다 먼저 개발될 수 있지만, 앞의 기능이 모두 개발되어 배포될 때 함께 배포된다.
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 반환하라.
작업 진도와 각 작업의 개발 속도는 다음과 같다.
[95, 90, 99, 99, 80, 99]
[1, 1, 1, 1, 1, 1]
이 두 배열을 통해서 각 작업이 개발 완료되는데 걸리는 시간을 구하는 것이 가능한데 그 식은 다음과 같다.
완료에 걸리는 시간 = 올림((100 - 현재 작업 진도) / 개발 속도)
따라서 각 작업에 걸리는 시간을 배열로 만들면 [ 5, 10, 1, 1, 20, 1 ]
이 나온다.
이것을 통해서 한번 배포에 얼마나 많은 작업이 함께 배포되는지를 계산하면된다.
첫 배포 때 0 인덱스의 작업을 배포하며 1 인덱스의 작업을 함께 배포할 수 없으므로 하나만 배포된다 [1]
두 번째 배포 때 1 인덱스의 작업과 2, 3 인덱스의 작업이 함께 배포 가능하므로 세 개의 작업이 함께 배포된다. [1, 3]
세 번째 배포 때 4 인덱스의 배포와 마지막 5 인덱스의 배포까지 함께 배포가 되므로 두 개의 작업이 함께 배포된다. [1, 3, 2]
따라서 주어진 예제의 반환 값은 [1, 3, 2]
이다.
function solution(progresses, speeds) {
let arr = []
let result = []
let count = 0
progresses.map((el, index) => {
arr.push(Math.ceil((100 - el) / speeds[index]))
})
let prev = arr[0]
while(arr.length !== 0) {
if(prev < arr[1] || arr.length === 1) {
count++
result.push(count)
count = 0
prev = arr[1]
}
else if(prev >= arr[1]) {
count++
}
arr.shift()
}
return result
}
progresses.map((el, index) => {
arr.push(Math.ceil((100 - el) / speeds[index]))
})
가장 먼저 각 작업이 개발되는데 걸리는 시간을 계산해서 새로운 배열에 담아준다. 각 배열의 같은 인덱스에 위치한 값들로 위의 식을 계산해서 담아준다. 주의사항은 나눈 값에 대해서 올림을 진행해서 2.3과 같은 실수에 대해서 소수점 아래에 존재하는 숫자는 하루로 볼 수 있도록 해준다.
while 문을 돌리며 조건에 따라 다른 작업이 이루어지도록 한다. 로직상 가장 앞의 숫자가 뒤에 올 숫자보다 크다면 그 개발 작업은 함께 배포가 가능하다. 따라서 가장 앞에 올 숫자를 저장하는 변수를 하나 만들고, 그 숫자와 이후에 올 숫자들을 비교해서 변수의 숫자가 더 크다면 함께 배포되도록 count++
를 진행한다.
만약 앞의 숫자가 뒤에올 숫자보다 작거나 (뒤 우선순위의 작업이 더 오래 걸리거나) 만들어진 배열에 더 이상 비교할 내용이 없다면 반환해줄 배열에 count를 넣어서 한 번 배포에 몇 개의 작업이 함께 배포되는지 알려주도록 한다.
while문이 모두 종료되면 반복문을 돌리면 만들어낸 배열을 return 하도록 한다.