[프로그래머스] 소수찾기(Level2) - 완전탐색 - JavaScript

조상래·2021년 6월 3일
0

프로그래머스

목록 보기
1/2

1. 문제해석

- numbers의 숫자들은 종이 조각을 의미
- numbers의 요소가 0 ~ 9까지 -> 각 요소가 단일 숫자. 즉, 두 자리의 요소가 한 숫자가 될 수 없음
- 0이 맨 앞자리인 경우 생략

2. 풀이

- bfs를 이용해 만들 수 있는 모든 숫자를 찾으면서 소수 검사를 한다.
- 숫자를 조합할 때 문자로 조합하고 소수를 검사할 땐 정수로 바꿔준다.
- 만약 소수라면 정수로 변환하여 stack에 push.
- 조합한 숫자를 정수로 바꾸었을 때 stack에 존재하거나 2를 넘긴다면 무시.

function solution(numbers) {
    const stack = [];
    
    const prime = (num) => {
        const sqrt = Math.floor(Math.sqrt(num));
        
        for (let i = 2; i <= sqrt; i += 1) {
            if (num % i === 0) {
                return false;
            }
        }
        return true;
    }
    
    const makeANum = (num, idx) => {
        if (num.length === numbers.length) return;
        
        for (let i = 0; i < numbers.length; i += 1) {
            if (idx.indexOf(i) !== -1) continue;
            
            const newNum = num + numbers[i];
            
            if (stack.indexOf(parseInt(newNum)) === -1 && parseInt(newNum) >= 2) {
                const isPrime = prime(parseInt(newNum));
                
                if (isPrime) {
                    stack.push(parseInt(newNum));
                }
            }
            makeANum(newNum, [...idx, i]);
        }
    }
    
    makeANum('', []);
    
    return stack.length;
}

주의할 점은 앞서 방문한 index를 다시 방문하면 안된다는 것. 방문한 index 목록을 같이 재귀로 넘겨 주고 만약 현재 탐색할 index가 방문한 index 목록에 있다면 무시.

profile
Codestates Full IM26기 교육 중 블로그 입니다. 現블로그는 해당 주소로 방문 부탁드립니다. https://sangrae-cho.github.io

0개의 댓글

관련 채용 정보