function permutations(arr, n) {
// 1개만 뽑는다면 그대로 순열을 반환한다. 탈출 조건으로도 사용된다.
if (n === 1) return arr.map((v) => [v]);
let result = [];
// 요소를 순환한다
arr.forEach((fixed, idx, arr) => {
// 현재 index를 제외한 요소를 추출한다.
// index번째는 선택된 요소
const rest = arr.filter((_, index) => index !== idx);
// 선택된 요소를 제외하고 재귀 호출한다.
const perms = permutations(rest, n - 1);
// 선택된 요소와 재귀 호출을 통해 구한 순열을 합쳐준다.
const combine = perms.map((v) => [fixed, ...v]);
// 결과 값을 추가한다.
result.push(...combine);
});
// 결과 반환
return result;
}
function isPrime(num) {
for (let i = 2; i * i <= num; i += 1) { // 이 부분이 변경됩니다.
if (num % i == 0) {
return false;
}
}
return true;
}
특정 수에 대해서 제곱근까지만 나눠 떨어지는지 검사하고, 그 이상은 검사할 필요가 없다.
위와 같이 작성하여 시간복잡도를 O(sqrt(n))으로 줄일 수 있다.
function solution(numbers) {
const arr = numbers.split('')
let loop = 0
function isPrime(num) {
for (let i = 2; i * i <= num; i += 1) { // 이 부분이 변경됩니다.
if (num % i == 0) {
return false;
}
}
return true;
}
function permutations(arr, n) {
// 1개만 뽑는다면 그대로 순열을 반환한다. 탈출 조건으로도 사용된다.
if (n === 1) return arr.map((v) => [v]);
let result = [];
// 요소를 순환한다
arr.forEach((fixed, idx, arr) => {
// 현재 index를 제외한 요소를 추출한다.
// index번째는 선택된 요소
const rest = arr.filter((_, index) => index !== idx);
// 선택된 요소를 제외하고 재귀 호출한다.
const perms = permutations(rest, n - 1);
// 선택된 요소와 재귀 호출을 통해 구한 순열을 합쳐준다.
const combine = perms.map((v) => [fixed, ...v]);
// 결과 값을 추가한다.
result.push(...combine);
});
// 결과 반환
return result;
}
const answer = []
while(loop <= arr.length) {
loop += 1
const permutataionLoop = permutations(arr, loop)
for(let i = 0; i < permutataionLoop.length; i++) {
const number = Number((permutataionLoop[i].reduce((sum, acc) => sum + acc)),'')
if(number >= 2 && !answer.includes(number)) {
if(isPrime(number)) {
answer.push(number)
}
}
}
}
return answer.length
}