반환값: 배포날짜에 따른 기능의 수 => 빠른날짜 순서대로 배열로 반환
조건 :
1. 기능들의 배포순서는 인덱스 순서이며, 진도율과 개발속도 배열이 주어짐
2. 진도율이 100이 되면 배포할 수 있다. (공식 : 현재 진도율 + 개발속도 * X(배포날짜) = 100)
3. 배포 순서가 뒤에 있는 기능은 배포날짜가 빠르다고 하더라도 앞의 기능과 함께 배포된다.
문제 풀이 과정:
1. 각 기능들의 배포날짜(기간)을 구한다.
2. 배포날짜 배열에서
-- 앞의 기능보다 배포날짜가 빠르거나 같은 것은 모두 앞의 기능 배포날짜로 바꾼다.
--앞의 기능이 뒤의 기능보다 빨리 배포될 수 있는 경우 앞의 기능 배포날짜에 배포한다.
풀이에 맞게 각각의 단계에서 하나의 함수를 만든다.
먼저 3개의 함수를 만든 경우.
function solution(progresses, speeds) {
let numFunc = []
let distributeDays = []
function calculateDays(){
for(let i = 0; i < progresses.length; i++){
distributeDays[i] = Math.ceil(((100 - progresses[i]) / speeds[i]))
}
}
function calculateDdays(){
for(let j = 0; j < distributeDays.length; j++){
if(distributeDays[j] > distributeDays[j+1]){
distributeDays[j+1] = distributeDays[j];
}
}
}
function caculateNumfunc(){
let num = 1;
for(let k = 0; k < distributeDays.length; k++){
if(distributeDays[k] == distributeDays[k+1]){
num = num + 1;
}else{
numFunc.push(num);
num = 1;
}
}
}
calculateDays();
calculateDdays();
caculateNumfunc();
return numFunc;
}
하지만 calculateDdays()와 calculateNumfunc()는 같은 길이와 유사한 구조의 for문으로 구성되어 있기 때문에 이를 합쳐서 쓸 수 있다. 또한 map 함수에서 index를 제공하기 때문에(api를 확인하는 버릇을 들이자!) 굳이 for문을 만들 필요 없이 코드를 간결하게 할 수 있다.
완성된 코드는 아래와 같다.
function solution(progresses, speeds) {
let numFunc = []
let caldays = (value, index) => Math.ceil(((100 - value) / speeds[index]))
let days = progresses.map(caldays)
let num = 1;
for(let i=0; i < days.length; i++){
if(days[i] >= days[i+1]){
days[i+1] = days[i]
num = num + 1;
}else{
numFunc.push(num);
num = 1;
}
}
return numFunc;
}
'ps' 카테고리의 다른 글
[완전 탐색] 소수 찾기 (0) | 2020.11.18 |
---|---|
[완전탐색] 모의고사 (0) | 2020.11.18 |
[정렬] 가장 큰 수, H-Index (0) | 2020.11.17 |
[우선순위큐] 디스크 컨트롤러 (0) | 2020.10.27 |
완주하지 못한 선수 (0) | 2020.10.16 |