프로그래머스 코딩테스트 연습 Level 2 - 소수 찾기 (JavaScript)
Programmers(프로그래머스)의 코딩테스트 연습문제 Level 2 중 완전탐색, 깊이 우선 탐색(DFS) 관련 문제인,
[소수 찾기] 문제를 JavaScript를 사용하여 해결해 보도록 하겠습니다.
문제
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
"17" | 3 |
"011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
작성한 답
solution.js
function solution(numbers) {
return [...new Set(getPer(numbers))].filter(v => isPrime(v)).length;
}
const getPer = (str) => {
const answer = [];
const n = str.length;
let ch = Array.from({ length: n }, () => 0);
const dfs = (curStr) => {
answer.push(+curStr);
for (let i = 0; i < n; i++) {
if (ch[i] === 0) {
ch[i] = 1;
dfs(curStr + str[i]);
ch[i] = 0;
}
}
}
dfs('');
answer.shift();
return answer;
}
const isPrime = (n) => {
if (n === 0 || n === 1) return false;
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false;
}
}
return true;
}
설명
약 2년전에 프로그래머스 코딩테스트 연습에서 해결했던 문제중에 Level 1의 같은 이름으로 '소수 찾기' 문제가 있었는데 Level 1 보다 오히려 Level 2 를 훨씬 쉽게 해결했습니다.
Level 1 소수 찾기 문제에서는 아리스토테네스의 체 라는 것을 알지 못하면 효율성 문제에서 통과할 수가 없었는데,
Level 2 소수 찾기 문제는 문제의 설명 그대로만 처리하면 해결 할 수가 있습니다.
종이 조각을 붙여 만들 수 있는 모든 수를 알아야 하기에 DFS 를 사용하여 순열을 구할 줄만 안다면 간단하게 해결할 수 있는 문제입니다.
DFS를 사용하여 종이 조각을 붙여 만들 수 있는 모든 수를 구해준 뒤, 중복되는 숫자가 있을 수 있기에 Set을 사용하여 중복을 제거해주고, 해당 숫자가 소수인지 아닌지를 판별주고 그 숫자를 반환하는 것만으로 문제를 해결할 수 있습니다.
도움이 되셨다면 공감, 댓글 부탁드립니다!
궁금하신 점이나 요청사항은 언제든지 말씀해주세요!
피드백도 언제나 환영입니다!
감사합니다.
'Developer > Algorithm' 카테고리의 다른 글
프로그래머스 코딩테스트 연습 Level 2 - 기능개발 (JavaScript) (0) | 2022.12.01 |
---|---|
프로그래머스 코딩테스트 연습 Level 2 - 피로도 (JavaScript) (0) | 2022.11.30 |
프로그래머스 코딩테스트 연습 Level 3 - 가장 먼 노드 (Python) (0) | 2022.11.28 |
프로그래머스 코딩테스트 연습 Level 3 - 여행경로 (JavaScript/Python) (0) | 2022.11.25 |
프로그래머스 코딩테스트 연습 Level 3 - 단어 변환 (JavaScript/Python) (0) | 2022.11.24 |
댓글