予算
2696 ワード
問題を読むと、私はこの探索と才能を利用して答えたいと思っています.
問題解決段階の設計はこうである.
--実行-halfisSmall()再帰->
--3-1. さらにrestarrを半分に切り、halfarrとrestarrの前半を合わせます.
--3-2. 次に、連結後の要素がサポート金額より大きくなるまで再実行します.
--3-3. 大きくなるとlastIndexを繰り返し削除し、並べ替えた金額の和がサポート金額より小さくなるまで、条件に達したら並べ替えます.length return
halfisBig()再帰の実行->
逆にhalfarrを半分に切り、再帰
コードはこうです.
function solution(d, budget) {
let sum = d.reduce((a,b)=>a+b);
if(sum <= budget) return d.length;
// 함수선언 영역
const arrSlice = (origin)=>{
//배열을 반으로 잘라 반과 나머지배열을 각각 return해주는 함수
const halfArr = origin.slice(0, Math.ceil(origin.length/2));
const restArr = origin.slice(Math.ceil(origin.length/2));
return [halfArr, restArr];
}
const halfIsSmall = (half, rest)=>{
let standard = half.reduce((a,b)=>a+b);
let result = half.length;
if(standard > budget){
while(standard > budget){
standard -= half[result-1];
result--;
}
return result;
}else{
[halfArr, restArr] = arrSlice(rest);
const halfPlusRest = half.concat(halfArr);
return halfIsSmall(halfPlusRest, restArr);
}
}
const halfIsBig = (half, rest)=>{
let standard = half.reduce((a,b)=>a+b);
let result = half.length;
if(standard < budget){
while(standard < budget){
standard += rest[0];
result++;
}
return result-1;
}else{
[halfArr, restArr] = arrSlice(half);
const restPlusHalf = rest.concat(restArr);
return halfIsBig(halfArr, restPlusHalf);
}
}
// 코드시작, 정렬된 sortArr의 halfArr 총 합이 지원금액보다 작다면
// halfIsSmall 재귀함수 실행
// 크다면 HalfIsBig 실행,
let sortArr = d.sort((a,b)=>a-b);
[halfArr, restArr] = arrSlice(sortArr);
const halfsum = halfArr.reduce((a,b)=>a+b);
if(halfsum === budget) return halfArr.length;
else if(halfsum < budget) return halfIsSmall(halfArr, restArr);
else return halfIsSmall(halfArr, restArr);
}
コミット時にarsliceという関数は使用されません.私は条件文の中で直接彼にスライスして、繰り返した部分がまぶしいです.
メモリやパフォーマンスの問題が改善されるかどうか知りたいです.
テストケースを例にとると、17回の加速速度は0.76ミリ秒から0.34ミリ秒に2倍に向上した.
それ以外にも、より高速(0.10ミリ秒から0.35ミリ秒)になる場合があります.
天井や床によっても少し違います.
自分の状況に合った最適な人を探しましょう.
Reference
この問題について(予算), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeon4137/프로그래머스-예산テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol