완전 탐색 - 소수 찾기
https://programmers.co.kr/learn/courses/30/lessons/42839
대략 어떻게 풀어야하는지 생각은 나는데 코드로 옮기는게 정말 쉽지 않았다 ㅠ
그래서 자료를 많이 찾아보고 이해하는 식으로 공부했다.
1번을 코드로 구현하는 데는 순열 알고리즘을 찾아서 로직을 이해하고 적용하였다..
순열 알고리즘은 잘 알아놔야겠다
function solution(numbers) {
// 배열로 쪼갬
numbers = numbers.toString().split("");
// 중복을 제거한 소수만 담기위해
const set = new Set();
// 1자리수 부터 numbers의 길이 자리수 까지 순열 연산
for (let i = 1; i <= numbers.length; i++) {
const answer = getpermutation(numbers, i);
// console.log(answer)
answer.forEach((v) => {
// 순열 연산으로 구한 배열을 join하여 숫자로 만들어준다.
const num = Number(v.join(""));
// 소수 구별위한 변수 초기화
let isPrime = true;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
isPrime = false; // 소수가 아니면 false
break;
}
}
if (isPrime && num > 1) set.add(num); // isPrime이 참이면서 1보다 큰 수(1은 소수가 아니기 때문에) 이면 소수이기때문에 set에 추가
});
}
return set.size; // set 객체의 원소 수 = 소수의 개수
}
// 순열 알고리즘
function getpermutation(arr, n) {
let result = [];
if (n == 1) return arr.map((v) => [v]);
arr.forEach((fixed, idx, origin) => {
let restArr = origin.filter((_, i) => i != idx); // fixed를 제외한 배열
let permutationArr = getpermutation(restArr, n - 1); // 나머지에서 순열을 구한다
let attached = permutationArr.map((p) => [fixed, ...p]); // 구한 순열에다가 fixed 붙이기
result.push(...attached);
});
return result;
}
2단계 넘어오면서 코드로 구현하는 과정이 너무 어려워졌다...ㅜㅜ
이 문제도 몇번 건드려보다가 포기하고 다시 풀고 포기하고 다시풀고 반복하다가 오늘 풀긴했는데 처음 풀 때 순열 알고리즘과 solution함수를 잘 연결했으면 그 때 풀었을 것같긴하다