알고리즘
프로그래머스 JS | 소수찾기(완전탐색)
3jun
2022. 11. 6. 22:31
1. numbers 를 가지고 만들 수 있는 조합들을 순열로 result 배열을 만든다.
2. result 배열에서 중복되는 조합과 소수가 아닌 인자들을 삭제한다.
2-1. 중복되는 조합은 Set 을 사용하여 삭제하고, 소수가 아닌 인자들은 isPrimeNumber 함수를 사용하여 삭제한다.
3. result 배열의 길이를 return 한다.
예외처리)) 0부터 시작하는 조합을 제외시켜줘야 한다.
처음에 newFixed[0] !== '0' 을 사용했으나, parseInt 를 사용하는 것이 더 깔금하고 예외 발생 가능성이 적다.
🔺 Solution ( 정확성 75 / 100 )
function solution(numbers) {
var result = new Set();
function getPermutation (arr, fixed) {
if(arr.length >= 1) {
for (let i=0; i<arr.length; i++) {
const newFixed = fixed + arr[i];
const copyArr = [...arr];
copyArr.splice(i, 1);
// 기존에 newFixed[0] !== '0'를 사용하였다가 parseInt로 수정
if(isPrimeNumber(parseInt(newFixed))) {
result.add(parseInt(newFixed));
}
getPermutation(copyArr, newFixed);
}
}
}
function isPrimeNumber(num) {
if(num < 2) return false;
for( let i = 2; i < Math.sqrt(num); i++) {
if(num % i === 0) {
return false;
}
}
return true;
}
getPermutation(numbers, '')
return result.size;
}
✅ Solution
function solution(numbers) {
var result = new Set();
function getPermutation (arr, fixed) {
if(arr.length >= 1) {
for (let i=0; i<arr.length; i++) {
const newFixed = fixed + arr[i];
const copyArr = [...arr];
copyArr.splice(i, 1);
if(isPrimeNumber(parseInt(newFixed))) {
result.add(parseInt(newFixed));
}
getPermutation(copyArr, newFixed);
}
}
}
function isPrimeNumber(num) {
if (num <= 1) return false;
if (num === 2) return true;
for( let i = 2; i <= Math.sqrt(num); i++) {
if(num % i === 0) {
return false;
}
}
return true;
}
getPermutation(numbers, '')
return result.size;
}
isPrimeNumber 가 틀렸으리라고는 생각지 못하고 getPermutaion에 어떤 문제가 있는지만 고민했었는데, 엉뚱한 곳에서 문제를 해결하였다. 소수인지 판단을 할때 1 이하일때는 소수가 아니고, 2는 소수이므로 이 2가지에 대한 처리를 해줘야 하는데, 첫번째 solution에서 num < 2 만 처리하고 num === 2일 때 처리를 빠뜨려 먹어서 에러가 발생했다.
💡 이미 공부했던 코드임에도 꼼꼼하게 생각하지 않고 넘어가서 실수가 발생했다.
💡 완전탐색과 Map, Set, DFS, BFS 에 대해 학습할 것
출처
- https://sumin-k.medium.com/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-javascript-%EC%99%84%EC%A0%84-%ED%83%90%EC%83%89-%EC%86%8C%EC%88%98-%EC%B0%BE%EA%B8%B0-1fdcdca4f59b