문제설명
기능개발은 기능들의 작업률을 담은 정수 배열 progresses와 각 기능들의 일일 작업 시간을 담은 정수 배열 speeds를 전달받는다. 각 기능은 작업률이 100%를 만족하면 배포가 완료되고 선행되는 작업이 100%가 될 때까지 뒤의 작업은 작업률이 100%라도 먼저 배포되지 않는다. 해당 조건을 만족하여 각 기능의 배포일에 배포되는 기능의 수를 담은 배열을 반환해야 한다.
문제해결
모든 기능들의 배포까지 며칠이 걸리는지 담은 정수 배열을 만든다.
진행률 P, 하루에 진행되는 시간 T일 때 배포 완료일 X는 (100 - P) / T 이다.
만약 4.555..일이면 5일로 처리하기 때문애 소수점이 나오면 올림을 해준다.
배포되는 기능의 수 count는 1로 초기화하고 배포 기준일 maxDay와 days의 요소를 비교하며 순회한다.
function solution(progresses, speeds) {
let answer = [];
// 배포완료일
let days = progresses.map((progress, i) => Math.ceil((100 - progress) / speeds[i]));
// 배포되는 기능의 수 = 1로 초기화
let count = 1;
// days와 비교할 첫 기능의 배포완료일
let maxDay = days[0];
for (let i = 1; i < days.length; i++) {
// 선행되는 배포가 다음 배포와 함께 종료될 때
if (days[i] <= maxDay) {
count++;
// 선행되는 배포가 완료되고 다음 배포가 진행될 때
} else {
// 비교할 배포완료일을 다음 배포로 교체 후 선행되는 배포의 count를 저장하고 초기화
maxDay = days[i];
answer.push(count);
count = 1;
}
}
// 마지막 배포될 기능의 수를 저장
answer.push(count);
return answer;
}
이상적인 코드
많은 추천을 받은 코드로 가독성과 언어 활용도를 모두 잡았다.
function solution(progresses, speeds) {
let answer = [0];
let days = progresses.map((progress, index) => Math.ceil((100 - progress) / speeds[index]));
let maxDay = days[0];
for(let i = 0, j = 0; i< days.length; i++){
if(days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
return answer;
}
for문에 변수 두 개를 선언하는 방법과 answer[0] = 0으로 초기화한 방법은 잘 사용해보지 않았지만 코드를 작성하면서도 햇갈리지 않을 것 같다.
![[Algorithm] 기능개발](https://www.notion.so/images/page-cover/gradients_8.png)