알고리즘

프로그래머스 JS | 소수찾기(완전탐색)

3jun 2022. 11. 6. 22:31

1. numbers 를 가지고 만들 수 있는 조합들을 순열로 result 배열을 만든다.

2. result 배열에서 중복되는 조합과 소수가 아닌 인자들을 삭제한다.

 2-1. 중복되는 조합은 Set 을 사용하여 삭제하고, 소수가 아닌 인자들은 isPrimeNumber 함수를 사용하여 삭제한다.

3. result 배열의 길이를 return 한다. 

 

예외처리)) 0부터 시작하는 조합을 제외시켜줘야 한다.

처음에 newFixed[0] !== '0' 을 사용했으나, parseInt 를 사용하는 것이 더 깔금하고 예외 발생 가능성이 적다. 

🔺 Solution ( 정확성 75 / 100 )

function solution(numbers) {
    var result = new Set();
    
    function getPermutation (arr, fixed) {
        if(arr.length >= 1) {
            for (let i=0; i<arr.length; i++) {
                const newFixed = fixed + arr[i];
                const copyArr = [...arr];
                copyArr.splice(i, 1);
                
                // 기존에 newFixed[0] !== '0'를 사용하였다가 parseInt로 수정
                if(isPrimeNumber(parseInt(newFixed))) {
                    result.add(parseInt(newFixed));
                }
                
                getPermutation(copyArr, newFixed);
            }
        }
    }
    
    function isPrimeNumber(num) {
        if(num < 2) return false;
        for( let i = 2; i < Math.sqrt(num); i++) {
           if(num % i === 0) {
               return false;
           }
        }
        return true;
    }
    
    getPermutation(numbers, '')

    return result.size;
}

✅ Solution

function solution(numbers) {
    var result = new Set();
    
    function getPermutation (arr, fixed) {
        if(arr.length >= 1) {
            for (let i=0; i<arr.length; i++) {
                const newFixed = fixed + arr[i];
                const copyArr = [...arr];
                copyArr.splice(i, 1);
                
                if(isPrimeNumber(parseInt(newFixed))) {
                    result.add(parseInt(newFixed));
                }
                
                getPermutation(copyArr, newFixed);
            }
        }
    }
    
    function isPrimeNumber(num) {
        if (num <= 1) return false;
        if (num === 2) return true;
        for( let i = 2; i <= Math.sqrt(num); i++) {
           if(num % i === 0) {
               return false;
           }
        }
        return true;
    }
    
    getPermutation(numbers, '')

    return result.size;
}

isPrimeNumber 가 틀렸으리라고는 생각지 못하고 getPermutaion에 어떤 문제가 있는지만 고민했었는데, 엉뚱한 곳에서 문제를 해결하였다. 소수인지 판단을 할때 1 이하일때는 소수가 아니고, 2는 소수이므로 이 2가지에 대한 처리를 해줘야 하는데, 첫번째 solution에서 num < 2 만 처리하고 num === 2일 때 처리를 빠뜨려 먹어서 에러가 발생했다. 

💡 이미 공부했던 코드임에도 꼼꼼하게 생각하지 않고 넘어가서 실수가 발생했다. 
💡 완전탐색과 Map, Set, DFS, BFS 에 대해 학습할 것
출처
- https://sumin-k.medium.com/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-javascript-%EC%99%84%EC%A0%84-%ED%83%90%EC%83%89-%EC%86%8C%EC%88%98-%EC%B0%BE%EA%B8%B0-1fdcdca4f59b