https://programmers.co.kr/learn/courses/30/lessons/42839
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
필자가 푼 문제풀이
function combination(numbers, selectNum) {
const results = [];
if (selectNum === 1) return numbers.map((el) => [el]);
numbers.forEach((fixed, idx, origin) => {
const rest = [...origin.slice(0, idx), ...origin.slice(idx + 1)];
const combinations = combination(rest, selectNum - 1);
const attached = combinations.map((el) => [fixed, ...el]);
results.push(...attached);
});
return results;
}
function findPrime(num) {
if( num < 2) return false;
for (var i =2; i <= num / 2 ; i++) {
if( num % i === 0) return false;
}
return true;
}
function solution(numbers) {
const result = [];
let answer = 0;
let num = numbers.split("").map((x) => Number(x));
for (let i = 1; i <= num.length; i++) {
result.push(...combination(num, i));
}
let set = [...new Set(result.flatMap(el=>Number(el.join(""))))];
for(let el of set){
if(findPrime(el)) answer++
}
return answer;
}
이 문제는 순열을 이용해 먼저 경우의 수를 구한 후 set을 이용해 숫자들을 배열에서 문자열로 바꿔주었다.
그다음 소수임을 판단하는 findPrime이란 함수를 만들어 소수를 판단하여 결과값을 반환하였다.
2022.02.21