본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level2] 소수 찾기

by Benjamin_Choi 2022. 1. 3.

/**
 * 소수 찾기
 * 완전 탐색
 * https://programmers.co.kr/learn/courses/30/lessons/42839?language=javascript
 */

 function solution(numbers) {
    var answer = 0, combination = [], numSet = new Set([]);
    const nums = numbers.split("");

    for (let i = 1; i <= numbers.length; i++) {
        combination = combination.concat(getCombinations(nums, i));
    }

    combination.forEach((comb) => {
        getPermutations(comb).forEach((permutation) => {
            numSet.add(parseInt(permutation.join("")))
        });
    });

    numSet.forEach((num) => {
        if (primeNumberChecker(parseInt(num))) answer++;
    })

    return answer;
}

function getPermutations(array) {
    let result = [];
  
    const permute = (arr, m = []) => {
      if (arr.length === 0) {
        result.push(m)
      } else {
        for (let i = 0; i < arr.length; i++) {
          let curr = [...arr];
          let next = curr.splice(i, 1);
          permute([...curr], m.concat(next))
       }
     }
   }
  
   permute(array)
  
   return result;
}

function getCombinations(array, selectNumber) {
    const results = [];
    if(selectNumber === 1){
        return array.map((element) => [element]);
    }
    array.forEach((fixed, index, origin) => {
        const rest = origin.slice(index+1);
        const combinations = getCombinations(rest, selectNumber - 1);
        const attached = combinations.map((combination) => [fixed, ...combination]);
        results.push(...attached);
    });
    return results;
}

function primeNumberChecker(num) {
    if (num < 2) return false;
    const sqrt = Math.floor(Math.sqrt(num));
    for (let i = 2; i <= sqrt; i++) {
        if (num % i === 0) return false;
    }
    return true;
}

console.log(solution("17"));
console.log(solution("011"));

input 을 배열로 쪼갠 뒤 조합으로 뽑아낸 배열들을 각각 순열로 집어넣어 나올 수 있는 모든 경우의 숫자들을 Set 에 겹치지 않게 넣고, 해당 값들을 primeNumberChecker 에서 소수인지 여부를 확인해서 총 소수의 갯수를 return 한다.

댓글