본문 바로가기

코딩테스트

[프로그래머스] level1. 소수 만들기 (javascript)

반응형

문제

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

나의 풀이

  1. sort를 통해서 가장 큰 수 3개를 얻는다.
  2. 가장 큰 수 기준으로 나올 수 있는 소수를 모두 구한다.
  3. 주어진 배열에서 나올수 있는 3개의 합을 다 구한다.
  4. 겹치는걸 찾는다.
function solution(nums) {
    var answer = -1;

    const arange = nums.sort((a,b)=>a-b).slice(nums.length-3,nums.length+1).reduce((acc,cur)=> acc += cur);
    let arr = [];

    for(let i =0; i<= arange; i++){
        arr.push(i);
    }

    for(let j = 2; j*j <=arange;j++){
        if(arr[j]){
            let val = arr[j]
            for( let q = val*val; q<=arange;q += val){
                arr[q] = 0
            }
        }
    }

    let arr1 = arr.filter((el)=>el);
    let arr2 = [];

    for(let a = 0; a < nums.length-2; a++){
        let tmp1 = nums[a];
        for(let b = a+1; b < nums.length-1; b++){
            let tmp2 = nums[b];
            for(let c = b+1; c < nums.length; c++){
                arr2.push(tmp1+tmp2+nums[c]);
            }
        }
    }

    answer = arr2.filter((el)=> arr1.find(element => element == el)).length

    return answer;
}

다른이들의 풀이

function primecheck(n){
    for(var i=2;i<=Math.sqrt(n);i++){
        if(n%i == 0){
            return false;
        }
    }
    return true;    
}
function solution(nums){
    var cnt = 0;
    for(var i=0;i<nums.length-2;i++){
        for(var j=i+1;j<nums.length-1;j++){
            for(var w=j+1;w<nums.length;w++){
                    //console.log(nums[i]+"/"+nums[j]+"/"+nums[w]);

                    if(primecheck(nums[i]+nums[j]+nums[w])){
                        //console.log(nums[i]+nums[j]+nums[w]);
                        cnt++;
                    }
            }
        }
    }
    return cnt;
}

위에 했던 1,2번은 뻘짓이였다. 그냥 3개의 합을 구한다음에 그 중에 소수가 있는지 찾으면 되는거였다..
소수 찾는게 어려울줄 알았는데 전혀 그렇지 않았다.
sqrt : square root (제곱근)

반응형