본문 바로가기
Developer/Algorithm

프로그래머스 코딩테스트 연습 Level 2 - 소수 찾기 (JavaScript)

by roqkfrlfhr 2022. 11. 29.

프로그래머스 코딩테스트 연습 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을 사용하여 중복을 제거해주고, 해당 숫자가 소수인지 아닌지를 판별주고 그 숫자를 반환하는 것만으로 문제를 해결할 수 있습니다.

 

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글