숫자로 이루어진 문자열 numbers가 주어졌을 때 (ex. '17') numbers에 해당하는 숫자들의 조합으로 만들 수 있는 숫자 중 소수의 갯수를 리턴해야 함 (ex.7, 17, 71)
1) 숫자들의 조합을 만들어 리턴하는 함수 생성(getPermutations)
: 숫자를 조합할 때 순서도 영향을 미치기 때문에 순열 함수를 만든다 (ex. 17, 71은 다른 숫자임)
2) 소수를 판별하는 함수 생성(isPrime)
function solution(numbers) {
// numbers를 한자릿 수로 분리
const numbersArr = numbers.split('');
// 1가지를 조합하여 만들 수 있는 경우의 수를 미리 넣어둠
let primesArr = [...numbersArr];
// 만들 수 있는 수들의 조합을 넣는 배열 선언
let combiNums = [];
// 조합의 갯수를 count할 answer변수 선언
let answer = 0;
// numbersArr와 요소를 선택할 갯수인 selectNumber를 인자로 받아 순열을 리턴하는 함수
const getPermutations = function(arr, selectNumber){
const result = [];
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);
result.push(...attached);
})
return result;
}
// 소수판별 함수
const isPrime = function(num){
// num === 0,1인 경우 예외 처리
if(num <= 1){
return false;
}
// num의 제곱근까지 반복문을 돌림으로써 코드 효율성 개선
for(let j = 2; j <= Math.sqrt(num); j++){
if(num % j === 0){
return false;
}
}
return true;
}
// 만들 수 있는 모든 순열의 갯수를 구하기 위해 반복문을 돌며 getPermutations 실행하여 primesArr에 넣음
for(let i = 2; i <= numbersArr.length; i++){
combiNums = getPermutations(numbersArr, i);
primesArr.push(...combiNums);
}
// primesArr 요소 숫자로 변횐
primesArr = primesArr.map((el) => parseInt(el));
// Set를 이용한 중복 숫자 제거
primesArr = [...new Set(primesArr)];
// primesArr 요소들이 소수인지 판별하여 answer 카운트
for(el of primesArr){
if(isPrime(el)){
answer++;
}
}
return answer;
}