본문 바로가기

코딩테스트

[프로그래머스] level2. 소수 찾기 (javascript)

반응형

문제

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

나의 풀이


function solution(numbers) {
    var answer = 0;

    //소수 찾는 함수
    function findprime(num){
        if(num == 0 || num ==1) return false
        if (num == 2 || num ==3 ) return true
        for(let i = 2; i <= num/2; i++){
            if(num%i==0) return false
        }
        return true
    }

    //순열 함수
    function re(arr,selectnum){
        let result = [];
        if(selectnum == 1) return arr.map(el=>[el])

        arr.forEach((fixed,index,origin)=>{
            const rest = [...origin.slice(0,index),...origin.slice(index+1)];
            const combinations = re(rest,selectnum-1);
            const attached = combinations.map(el=>[fixed,...el])

            result.push(...attached)
        })
        return result
    }
    numbers = numbers.split("")

    let methods = []
    for(let i =1; i <=numbers.length;i++){
        let final =  re(numbers,i)
        methods.push(...final)
    }

    let set = [...new Set(methods.flatMap(el=>Number(el.join(""))))]

    for(let el of set){
        if(findprime(el)){
            answer++    
        }
    }

    return answer;
}

 

순열을 통해 모든 경우의 수를 구하고, 이를 for문으로 소수 찾는 함수를 돌려서 해당 되는 갯수만큼 answer의 수를 올려주도록 구성하였습니다.

 

다른이의 풀이

function solution(numbers) {
    var answer = 0;

    var n = numbers.split('');
    var nums = new Set()
    combi(n,'');

    function combi(a, s) {
        if (s.length > 0) {
            if (nums.has(Number(s))=== false) {
                nums.add(Number(s));
            //console.log(Number(s))
                if (chkPrime(Number(s))) {

                    answer++;
                }
            }
        }
        if (a.length > 0) {
            for (var i = 0; i< a.length; i++) {
                var t = a.slice(0)
                t.splice(i,1);
                //console.log(t)
                combi(t,s + a[i]);
            }
        }
    }

    function chkPrime(num) {
        if( num < 2) return false;
        for (var i =2; i <= num / 2 ; i++) {
            if( num % i === 0) return false;
        }
        return true;
    }
    return answer;
}

combi 부분은 봐도 잘 이해가 안간다.
그래도 소수 찾는 부분에서 굳이 3이나 2를 따로 처리할 필요는 없었다.

반응형