본문 바로가기
Algorithm/Programmers

[Programmers] 소수 찾기(JavaScript)

by 백승전 2022. 8. 9.

 

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/42839

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

 

코드

 

function isPrime(n){
    if(n < 2) return false;
    for(let i = 2; i <= Math.sqrt(n); i++){
        if(n % i == 0) return false;
    }
    return true;
}

function solution(numbers){
    let arr = numbers.split('');
    let answer = new Set(); // 중복 제거
    
    function permutation(num, fix){
        if(num.length){
            for(let i = 0; i < num.length; i++){
                let copyArr = [...num];
                copyArr.splice(i, 1);
                
                if(isPrime(parseInt(fix + num[i]))){
                    answer.add(parseInt(fix + num[i]));
                }
                permutation(copyArr, fix + num[i]);
            }
        }
    }
    permutation(arr, '');
    return answer.size;
}

 

풀이

 

소수를 판별할 함수와, 순열 함수를 만들어, 소수일 시, 빈 배열에 담아줍니다.

 

처음에 받아오는 numbers가 한자리 숫자들이 합쳐서 넘어오기 때문에(1, 7 > 17) split() 메서드를 사용해 하나씩 쪼개어 줍니다. 그리고 이후에 이 숫자들을 순열할 함수를 만들어야 하는데요.

 

순열 함수를 만들어, 받아온 배열의 길이만큼 반복문을 돌려 소수를 판별하는 함수에 담아 소수만 걸러주는 작업을 합니다.

이때 소수가 아닐 시에는 다시 함수에 담아 찾아주는데, 그냥 담아주면 무한 루프가 발생하기 때문에, splice 함수를 사용해 fix를 제외한 나머지를 잘라서 다시 담아주도록 합니다.

 

결과값을 리턴할 때 중복으로 담길 수 있기 때문에,(테스트 케이스 2번 [11, 11, 101, 11, 101, 11]와 같이) 배열의 중복 제거를 해줘야 합니다. 때문에 new Set() 객체를 사용하여 자동으로 중복 제거를 해주고, new Set() 사용 시 push로 담는 게 아닌 add로 추가, 최종적으로 배열의 길이를 리턴 할 때도 size 접근자를 사용해 Set 객체의 수를 리턴해줘야 합니다.

댓글