소수만들기

Creating the dots·2021년 9월 25일
0

Algorithm

목록 보기
15/65
post-custom-banner

https://programmers.co.kr/learn/courses/30/lessons/12977

일부 테스트케이스만 통과

function solution(nums) {
    var answer = [];
    var sums = [];
    //숫자 세개를 고르는 함수 (조합)
    const combination = (nums,selectNum) => {
        const result = [];
        if(selectNum===1) return nums.map((v)=>[v]);
        nums.forEach((v,idx,nums)=>{
            const fixed = v;
            const restArr = nums.slice(idx+1);
            const combinationArr = combination(restArr,selectNum-1);
            const combineFix = combinationArr.map((v)=>[fixed,...v]);
            result.push(...combineFix);
        });
        return result;
    }
    const threeNums = combination(nums,3);
    
    //세 숫자를 합하고, 배열 sums에 합을 push한다
    const add = (arr)=>{
        for(let i=0;i<arr.length;i++){
            const sum = arr[i][0]+arr[i][1]+arr[i][2]
            if(!sums.includes(sum)){ //배열 sums에 동일한 값이 존재하지 않을때만 push하기
                sums.push(sum);
            }else{
                continue;
            }
        }
    }
    add(threeNums);
    
    //소수인지 확인하는 함수
    function isPrime(num) {
        let sqrt = parseInt(Math.sqrt(num));
        if (num === 1) {return false;}
        if (num === 2) {return true;}
        if (num % 2 === 0) {return false;}
        for (let i = 3; i <= sqrt; i += 2) {
            if (num % i === 0) {return false;}
        }
        return true;
    }

    const listPrime = (arr) =>{
        for(let i=0;i<arr.length;i++){
            if(isPrime(arr[i])){
                answer.push(arr[i]);
            }else{
                continue;
            }
        }
    }
    
    listPrime(sums);
    return answer.length;
}

위와 같이 풀었을때 100개의 테스트케이스 중 23개 정도만 통과했다. 질문을 보니 나와 같은 경우가 많았다. 결과적으로 add 함수에서 문제가 발생한 거였다.

if(!sums.includes(sum)){
  sums.push(sum)
}else{
  continue
}

이 부분에서 sums 배열에 이미 sum값이 존재하면 푸시하지 않았다. 그런데, 뽑은 세개의 숫자의 합이 같더라도, 조합이 다르기 때문에 배열에 존재하더라도 푸시해줘야한다. 예를 들어,
[1,2,3,4,5,6,7,8,9,10]에서 세개의 숫자를 골라서 1+2+1013이고,1+3+9,1+4+7 등의 경우의 수도 모두 13이다. 따라서 모두 합이 13이더라도, 다른 경우의 수로 만들어진 합이기 때문에 카운트해줘야한다.

따라서 다음과 같이 수정해주면 모든 테스트케이스를 통과한다

모든 테스트케이스 통과

function solution(nums) {
    var answer = [];
    var sums = [];
    //숫자 세개를 고르는 함수
    const permutation = (nums,selectNum) => {
        const result = [];
        if(selectNum===1) return nums.map((v)=>[v]);
        nums.forEach((v,idx,nums)=>{
            const fixed = v;
            const restArr = nums.slice(idx+1);
            const permutationArr = permutation(restArr,selectNum-1);
            const combineFix = permutationArr.map((v)=>[fixed,...v]);
            result.push(...combineFix);
        });
        return result;
    }
    const threeNums = permutation(nums,3);
    
    //세 숫자를 합하는 함수
    const add = (arr)=>{
        for(let i=0;i<arr.length;i++){
            const sum = arr[i][0]+arr[i][1]+arr[i][2];
            sums.push(sum);
        }
    }
    add(threeNums);
    
    //소수인지 확인하는 함수
    function isPrime(num) {
        let sqrt = parseInt(Math.sqrt(num));
        if (num === 1) {return false;}
        if (num === 2) {return true;}
        if (num % 2 === 0) {return false;}
        for (let i = 3; i <= sqrt; i += 2) {
            if (num % i === 0) {return false;}
        }
        return true;
    }

    const listPrime = (arr) =>{
        for(let i=0;i<arr.length;i++){
            if(isPrime(arr[i])){
                answer.push(arr[i]);
            }else{
                continue;
            }
        }
    }
    
    listPrime(sums);
    return answer.length;
}
profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글