Lv2. 소수 찾기 Javascript
https://programmers.co.kr/learn/courses/30/lessons/42839
function primality(n) {
if (n < 2) return false;
let i = 2;
while (i * i <= n) {
if (n % i == 0) {
return false;
}
i++;
}
return true;
}
function solution(numbers) {
const arr = [...numbers];
let result = [];
const getNums = (fixed, arr) => {
if (arr.length >= 1) {
for (let i = 0; i < arr.length; i++) {
const newFixed = fixed + arr[i];
const restArr = arr.slice();
restArr.splice(i, 1);
result.push(newFixed);
getNums(newFixed, restArr);
}
}
};
getNums("", arr);
result = [...result].map((item) => Number(item));
result = new Set(result);
result = [...result].filter((item) => primality(Number(item)));
return result.length;
}
완전 탐색 문제로, 아래의 세 단계를 밟아 해결함.
1. 문자 뽑아내기
2. 소수 찾기
3. 기타 처리
재귀함수를 활용한 순열
let result = [];
const getNums = (fixed, arr) => {
if (arr.length >= 1) {
for (let i = 0; i < arr.length; i++) {
const newFixed = fixed + arr[i];
const restArr = arr.slice();
restArr.splice(i, 1);
result.push(newFixed);
getNums(newFixed, restArr);
}
}
};
getNums("", arr);
의 범위에 약수가 존재하는지 확인하여 소수 판별 (시간복잡도: )
ex) 의 약수 =
의 약수는 이하의 값과 이상의 값의 짝으로 이루어져 있으므로,
이하의 값을 확인하면 이상의 값은 확인할 필요가 없음.
(은 소수가 아니기 때문에 는 부터 시작)
function primality(n) {
if (n < 2) return false;
let i = 2;
while (i * i <= n) {
if (n % i == 0) {
return false;
}
i++;
}
return true;
}
숫자 변환, 중복 제거, 소수 찾기
result = [...result].map((item) => Number(item)); // map : String to Number
result = new Set(result); // set : 중복 제거
result = [...result].filter((item) => primality(Number(item))); // filter : 소수 찾기
return result.length; // 문제에서 원하는 값은 소수인 숫자의 갯수
처음에 확인할 문자를 뽑아내지 못해서 결국 구글링.
재귀를 통한 완전 탐색에 대한 이해가 매우 어려웠던 문제.
엑셀에 하나하나 정리해보면서 이해 완료.
댓글 환영
질문 환영
by.protect-me