[プログラマー]小数JavaScriptを求める


問題の説明


与えられた数字のうち3つの数字を小数に加算すると、個数を求めてみます.数値を持つ配列numsをパラメータとする場合は、solution関数を完了してnumsの3つの異なる数値の小数を返します.

せいげんじょうけん

  • numsに含まれる数字は3つまたは50個を超えない.
  • numsの各要素は1000より大きい自然数であり、重複する数字は含まれていない.
  • I/O例



    I/O例説明


    I/O例#1
    [1,2,4]を使用して7を作成できます.
    I/O例#2
    [1,2,4]を使用して7を作成できます.
    [1,4,6]を使用して11を作成できます.
    [2,4,7]は、13を作成するために使用することができる.
    [4,6,7]を使用して17を作成できます.

    コンポジット


    問題を読み始めたばかりの頃は「簡単ですよね?」思いついた.でも思ったよりもっとまずはグループ!配列から3つの組み合わせを選ぶことを考えます.
     const getCombinations = function (arr, selectNumber) {
        const results = [];
        if (selectNumber === 1) return arr.map((el) => [el]); 
        // n개중에서 1개 선택할 때(nC1), 바로 모든 배열의 원소 return
    
        arr.forEach((fixed, index, origin) => {
          const rest = origin.slice(index + 1); 
          // 해당하는 fixed를 제외한 나머지 뒤
          const combinations = getCombinations(rest, selectNumber - 1); 
          // 나머지에 대해서 조합을 구한다.
          const attached = combinations.map((el) => [fixed, ...el]); 
          //  돌아온 조합에 떼 놓은(fixed) 값 붙이기
          results.push(...attached); 
          // 배열 spread syntax 로 모두다 push
        });
    
        return results; // 결과 담긴 results return
    }
    JavaScriptシーケンスとの組合せベルログを参照してください.
    上手に書かれていると思われるコードから、map()を積極的に使用しています.

    小数点を検索


    isPrimeは実は何度も質問をしたことがあります.
    function isPrime(num) {
      // 소수는 1과 자기 자신만으로만 나누어 떨어지는 수 임으로
      // num > i
      for(let i = 2; num > i; i++) {
      if(num % i === 0) { //이 부분에서 num이  다른 수로 나눠떨어진다면 소수가 아님
        return false;
       }
      }
     // 소수는 1보다 큰 정수임으로
     // 1보다 작으면 false를 리턴한다
     return num > 1;
    }

    solution


    このように私が最終的に制定した解決策は以下の通りです.組合せを使用して3つの要素の配列をresult配列に挿入し、count変数を宣言します.次にresult配列の長さfor文に従って、要素の和をsum 1に配置します.またsum 1が少数であればcountプラス1は比較的容易なアルゴリズムである.
    
    function solution(nums) {
        const result = getCombinations(nums, 3);
        let count = 0;
        for(let i=0;i<result.length;i++){
            let sum1 = result[i].reduce((sum2, currValue) => {
                return sum2 + currValue;    
            });
            if(isPrime(sum1)){
                count += 1;
            }
        }
        return count;
    }