@ 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중
각 기능은 진도가 100%일 때 서비스에 반영
또, 각 기능의 개발속도는 모두 다르기 때문에
- 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발 가능
- 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포
- 먼저 배포되어야 하는 순서대로
작업의 진도가 적힌 정수 배열progresses
- 각 작업의 개발 속도가 적힌 정수 배열
speeds
각 배포마다 몇 개의 기능이 배포되는지를 return
progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
progresses speeds return
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1, 1] [1, 3, 2]
큐를 사용한 코드
function solution(progresses, speeds) {
var answer = [];
let days = 1;
let cnt = 0;
let progress = 0;
while (progresses[0]) {
progress = progresses[0] + (speeds[0] * days);
if (progress >= 100) {
cnt++;
progresses.shift();
speeds.shift();
} else {
if (cnt > 0) {
answer.push(cnt);
}
days++;
cnt = 0;
}
}
answer.push(cnt);
return answer;
}
해석
# 큐를 이용한 FIFO
days : 배포일
cnt : 해당 배포일에 배포할 기능 개수
progress : 작업 진도
[코드 해석]
* 마지막 개발을 끝낼 때 까지 반복
* 작업 진도 계산
* 작업 100 이상이면
* cnt + 1
* progresses 맨 앞 방출
* speeds 맨 앞 방출
* 작업 100 미만이면
* cnt 가 0 보다 크면
* 배포일 cnt 등록
* days + 1
* cnt = 0
* 마지막 배포일의 개수 등록
나의 코드
function solution(progresses, speeds) {
const days = progresses.map((progress, index)
=> Math.ceil((100 - progress) / speeds[index]));
const answer = { maxDay : days[0], nth: 0, dates: [0] };
return days.reduce((acc, cur) => {
if (cur <= acc.maxDay) {
acc.dates[acc.nth] += 1;
} else {
acc.maxDay = cur;
acc.nth += 1;
acc.dates[acc.nth] = 1;
}
return acc;
}, answer)["dates"];
}
해석
# Javascript 의 내장 기능 Map, Reduce 를 이용한 풀이
days : 배포일 남은 일자 배열
answer : reduce 의 필요 객체 초기값
- maxDay : 배포 전 남을 일자가 제일 긴 일자
- nth : 배포가 완료된 배포일 개수
- dates : 배포일에 배포되는 기능 개수 [ 반환 값 ]
[코드 해석]
* progresses 와 speeds 를 계산한
남은 일자 계산 후 days 배열 반환
* 배열의 누적 계산
* 현재 순서에 남은 일자가 maxDay 이상이면
* acc.dates[acc.nth] += 1
* 현재 순서에 남은 일자가 maxDay 미만이면
* acc.maxDay = cur
* acc.nth += 1
* acc.dates[acc.nth] = 1
* 객체에 dates 반환