programmer-小数点を作成する


問題の説明


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

せいげんじょうけん


∙numsの数字の個数は3個以上50個以下です.
∙numsの各要素は1または1000以下の自然数であり、重複する数字は含まれません.

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を作成できます.
function solution(nums) {
    let answer = [];
    let combinations = [];
    let i = 0;
    
    while( i < nums.length){
        for( let j = i + 1; j < nums.length; j++){
            for(let x = j + 1; x < nums.length; x++ ){
                if(combinations.indexOf( nums[i] + nums[j] + nums[x] ) < 0){
                    combinations.push(nums[i] + nums[j] + nums[x]);
                }
            }
        }
        i++;
    }

    for(let x = 0; x < combinations.length; x++){
        let count = 0;
        for(let y = 1; y <= combinations[x]; y++ ){
            if( combinations[x] % y === 0){
                count++;
            }
        }

        if(count === 2){
            answer.push(combinations[x]);
        }
    }
    
    return answer.length;
}
3つの複文を回し,できるだけ多くの3桁の組合せを求める.しかし,3桁の症例が1,2個出現したため,精度は悪かった.重複する数字はないので,組合せ配列にindexOfを書き込む必要はない.
function solution(nums) {
    let answer = [];
    let combinations = [];
    let i = 0;
    
    while( i < nums.length){
        for( let j = i + 1; j < nums.length; j++){
            for(let x = j + 1; x < nums.length; x++ ){
            	combinations.push(nums[i] + nums[j] + nums[x]);
            }
        }
        i++;
    }

    for(let x = 0; x < combinations.length; x++){
        let count = 0;
        for(let y = 1; y <= combinations[x]; y++ ){
            if( combinations[x] % y === 0){
                count++;
            }
        }

        if(count === 2){
            answer.push(combinations[x]);
        }
    }
    
    return answer.length;
}
次に、これに似ていますが、演算時間が短い別の人の答えを示します.
function solution(nums){
  let count = 0;
  let temp = [];
  for(let i = 0; i < nums.length; i++){
    for(let j = i + 1; j < nums.length; j++){
      for(let k = j + 1; k < nums.length; k++){
        let sum = nums[i] + nums[j] + nums[k];
        temp.push(sum);
      }
    }
  }

  for(let l = 0; l < temp.length; l++){
    if(primeNumber(temp[l])){
      count++;
    }
  }
  return count;
}


function primeNumber(nums){
  for(let i = 2; i * i <= nums; i++){
    if(nums % i === 0) return false;
  }
  return true;
} // 소수판별 함수 버전1 => N의 약수는 제곱근 N의 범위에 존재
    
function primeNumber(nums){
    let count = 0;
    for(let i = 1; i <= nums; i++){
        if(nums % i === 0) count++;
    }
    if(count === 2){
        return true;
    }else if( count > 2){
        return false;
    }
} // 소수판별 함수 버전2 => 기존에 알았던 방식
    
参照)
https://velog.io/@diddnjs 02/エンコードテストプログラマー-小数-作成
https://jm-park.github.io/algorithm/2018/08/06/Prime-Number(小数)-判別法-アルゴリズム。html

+) python version

def solution(nums):
    answer = []
    combinations = []
    i = 0
    
    while i < len(nums):
        for j in range(i + 1, len(nums)):
            for x in range(j + 1, len(nums)):
                combinations.append(nums[i] + nums[j] + nums[x])
        i += 1
    

    
    for x in range(0, len(combinations)):
        count = 0
        for y in range(1, combinations[x] + 1):
            if combinations[x] % y == 0:
                count += 1
                
        if count == 2:
            answer.append(combinations[x])

    return len(answer)
from itertools import combinations 
def check(a, b, c): 
    total = a + b + c
    for i in range(2, total): 
        if total % i == 0 : return False 
    return True 

def solution(nums):
    answer = 0
    A = list(combinations(nums, 3))
    for i in A: 
        if check(i[0], i[1], i[2]): answer += 1
    return answer
from itertools import combinations
import math
def solution(nums):
    candidates = combinations(nums, 3)
    answer = 0
    for item in candidates:
        sums = sum(item)
        is_prime = True
        for i in range(2, int(math.sqrt(sums)) + 1): // N의 약수는 해당 제곱근 범위에 있음
            if sums % i == 0:
                is_prime = False
                break
        if is_prime:
            answer += 1
    return answer
    
参照)
https://eda-ai-lab.tistory.com/493
https://inspirit941.tistory.com/entry/Python-プログラマ-小数-作成-レベル-2