IT/Algorithm

프로그래머스) 소수 만들기

프티 2021. 10. 19. 08:06
반응형

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

 

코딩테스트 연습 - 소수 만들기

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

programmers.co.kr

 

나의 풀이

function solution(nums) {
    const combiList = [];

    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length; j++) {
            for (let k = 0; k < nums.length; k++) {
                if (!combiList.includes(JSON.stringify([nums[i], nums[j], nums[k]].sort())) && nums[i] !== nums[j] && nums[i] !== nums[k] && nums[j] !== nums[k]) {
                    combiList.push(JSON.stringify([nums[i], nums[j], nums[k]].sort()));
                }
            }
        }
    }

    return combiList.map(arr => JSON.parse(arr).reduce((acc, cur) => acc + cur))
                    .filter(val => {
        for (let i = 2; i <= Math.sqrt(val); i++) {
            if (!(val % i)) {
                return false;
            }
        }

        return true;
    }).length;
}

3중 반복문으로 nums에서 숫자 3가지를 골라 저장하였다.

 

sort한 배열을 stringify로 push하였고,

중복을 방지하기 위하여 includes()를 사용하였다(조건문이 길어짐..).

 

그리고 combiList를 map을 활용하여 reduce한 값으로 변환시켜주고,

filter로 소수만 걸러낸다.

 

소수를 판별하는 반복문에서,

약수를 모두 구할 필요는 없다.

 

i를 2부터 시작하여 값의 루트 값까지만 반복문을 진행하면 된다.

 

이렇게 걸러진 배열의 길이가 곧 정답이 된다.

 

다른 사람의 풀이

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;
}

이분은 primecheck라는 함수를 따로 만들어서 나처럼 배열을 만들지 않고 그때 그때 함수를 적용시켰다.

 

3중 반복문은 배열에서 3개의 숫자를 골랐을 때 애초에 겹치는 값이 없도록 i, j, k의 범위를 정한 것이 눈에 띄었다.

반응형