https://school.programmers.co.kr/learn/courses/30/lessons/42839#
우선 크게 두가지가 보인다.
문제가 dfs를 통해서 풀 수 있다는 것은 알았는데 dfs를 통해서 순열,조합 문제를 여러 번 풀었는데도 아직 감이안잡힌다..
function isPrime(n) {
if (n < 2) return false;
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) return false;
}
return true;
}
소수를 판별하는데는 제곱수를 통한 방법을 사용하였다.(N의 약수는 무조건 sqrt(N)의 범위에 존재한다.)
에라토스테네스의 체를 사용해도 된다.
function dfs(set, arr, fixed) {
if (arr.length >= 1) {
for (let i = 0; i < arr.length; i++) {
let newFixed = fixed + arr[i];
let copyArr = [...arr];
copyArr.splice(i, 1);
if (isPrime(parseInt(newFixed))) {
set.add(parseInt(newFixed));
}
dfs(set, copyArr, newFixed);
}
}
}
for문을 돌때마다 매번 수들 중 하나를 선택하고 newFixed
는 지금까지 선택된 수 문자열, copyArr
은 선택되고 남은 수 문자열, set
은 소수인 수를 담고있으므로 최종적으로 set
의 사이즈가 답이된다.
주의할점은 소수를 판별할때는 문자열로 넘겨도 되지만("011", "11") set에 넣을때는 "011"과 "11"은 다르게 인식하므로 중복을 제거하기 위해서 정수로 변환해서 넣어야 한다.
function isPrime(n) {
if (n < 2) return false;
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) return false;
}
return true;
}
function dfs(set, arr, fixed) {
if (arr.length >= 1) {
for (let i = 0; i < arr.length; i++) {
let newFixed = fixed + arr[i];
let copyArr = [...arr];
copyArr.splice(i, 1);
if (isPrime(parseInt(newFixed))) {
set.add(parseInt(newFixed));
}
dfs(set, copyArr, newFixed);
}
}
}
function solution(numbers) {
let nums = numbers.split("");
let set = new Set();
dfs(set, nums, "");
return set.size;
}
console.log(solution("011"));
https://velog.io/@im_hass_/Level2.-%EC%86%8C%EC%88%98-%EC%B0%BE%EA%B8%B0