이 문제를 풀려면
을 알아야 했다. 물론 다른 풀이를 보면 굳이 위 개념들을 알지 않아도 풀기도 한다. 하지만 차근차근 개념을 익혀가면서 풀고 싶었기에 해당 개념들을 탐독하면서 풀었다.
결과적으로 코드는 아래와 같다.
let numbersArr = numbers.split("");
let includes = numbersArr.map(num => !num);
let answer = 0;
const dataSet = new Set();
const primeSet = new Set();
const isPrime = num => {
if (num < 2) return false;
if (num === 2) return true;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {
return false;
}
}
return true;
};
const permutation = (k) => {
if(k === numbersArr.length) {
dataSet.add(numbersArr.join(""));
}
for(let i = k; i < numbersArr.length; i++) {
swap(numbersArr, k, i);
permutation(k+1);
swap(numbersArr, k, i);
}
}
const powerset = (k, arr) => {
if(k === arr.length) {
let temp = "";
for(let i = 0; i < arr.length; i++) {
if(includes[i]) {
temp += arr[i];
}
}
return temp !== "" && primeSet.add(parseInt(temp));
}
includes[k] = false;
powerset(k+1, arr);
includes[k] = true;
powerset(k+1, arr);
}
const swap = (data, k, n) => {
let temp = data[k];
data[k] = data[n];
data[n] = temp;
}
permutation(0);
for(let data of dataSet) {
powerset(0, data);
}
console.log(primeSet);
[...primeSet].forEach((el) => {
if(isPrime(el)) {
answer++;
}
});
console.log(answer);
return answer;
큰 순서로 보면 아래와 같다.
1234
로 주어지면 1243
, 1324
....등이 나옴1234
에 대한 멱집합은 1
2
3
4
12
... 등이 나옴011
11
를 같은 숫자로 구분하지 못한다.소수 검사, 순열, 멱집합 를 사용하는 이유는 아래 글을 참고하면 이해될 것이다.