본문 바로가기
Study Note/Algorithm

프로그래머스 #완전탐색 - 소수 찾기 lv2

by 시뮝 2021. 9. 12.
728x90

문제

 

풀이

function solution(numbers) {
    let answer = 0;
    let allPermutations = []; // 모든 경우의 수 [순열]
    let permutationsSet = []; // 중복을 제거한 경우의 수
    
    // 1. 숫자 조합 순열 구하기
    allPermutations = getAllPermutations([...numbers]);
    // 2. 중복제거
    permutationsSet = getPermutationsSet(allPermutations)
    // 3. 소수 갯수 구하기
    answer = getCountDicimal([...new Set(permutationsSet)]);
    
    return answer;
}

// 1. 숫자 조합 순열 구하기
function getAllPermutations(numbers) {
    let results = [];

    function getPermutations(arr, selectNumber) {
        const perm = [];
        if (selectNumber === 1) return arr.map((el) => [el]); 

        arr.forEach((fixed, index, origin) => {
            const rest = [...origin.slice(0, index), ...origin.slice(index+1)] 
            const permutations = getPermutations(rest, selectNumber - 1); 
            const attached = permutations.map((el) => [fixed, ...el]); 
            perm.push(...attached); 
        });

        return perm;
    }

    for(let i=1; i<=numbers.length; i++) {
        const perm = getPermutations(numbers, i);
        const permToString = perm.map((el) => el.join(''))
        results.push(...permToString);
    }
    return results;
}

// 2. 중복제거
function getPermutationsSet(permutations) {
    let result;
    
    result = [...new Set(permutations)];
    result = result.filter((el) => el > 1).map((el) => Number(el));
    result = [...new Set(result)];
    
    return result;
}

// 3. 소수 갯수 구하기  arr ex) ['1', '7', '17', '71']
function getCountDicimal(arr) {
    let count = 0;

    function isDicimal(number) { // ex) '71'
        for(let i=2; i*i<=number; i++) {
            if (0 === number%i) {
                return 0;
            }
        }
        return 1;
    }
    for(let i=0; i<arr.length; i++) {
        count += Number(isDicimal(arr[i]));
    }
    return count;
}

 

채점 결과

728x90

댓글