✨ Lv. 2 - 소수 찾기
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42839
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
숫자가 적힌 종이 조각을 각각 1, 2, 3, ... n
개를 어떤 순서에 따라 선택했냐에 따라 만들 수 있는 숫자의 가짓수는 다양해집니다. 이를 DFS
를 이용하여 풀이해봅시다.
우선 선택 여부를 판단할 selected
배열을 선언하여 모든 값을 false
로 초기화합니다. 이후, DFS
를 반복하여, 매번 선택한 카드들에 대해 소수인지 판단하여 소수일 경우에는 결과를 담을 result
에 add
합니다. 여기서 result
는 중복을 방지하기 위해서 Set
을 사용합니다.
이후, result
에 담긴 원소의 개수를 return 하여 문제를 해결합니다.
function solution(numbers) {
const result = new Set();
const selected = new Array(numbers.length).fill(false);
function DFS(current) {
if(isPrime(Number(current))) result.add(Number(current));
[...numbers].forEach((v, i) => {
if(!selected[i]) {
selected[i] = true;
DFS(current + v);
selected[i] = false;
}
})
}
DFS("");
return [...result].length;
}
function isPrime(n) {
if(n === 1 || n === 0) return false;
let counter = 0;
for(let i = 2; i <= Math.sqrt(n); i++) if(n % i === 0) counter++;
return counter === 0;
}