개발 블로그

[프로그래머스/Javascript/Brute Force] 소수 찾기 본문

IT/Programmers

[프로그래머스/Javascript/Brute Force] 소수 찾기

파티에 2021. 4. 13. 23:31

1. 문제 설명(출처: programmers.co.kr/learn/courses/30/lessons/42839)

2. 문제 풀이
1) 소수들을 저장할 공간을 만드는데, 종이 조각을 조합하다보면 중복이 발생할 수 있으니 Set을 사용한다.
2) 종이 조각들을 통해 만들 수 있는 모든 경우의 수의 숫자들 만드는 함수를 만든다.(permutator)
   2-1) 만약 arr에 숫자가 남아있다면
      2-1-T1) 남은 arr만큼 아래 명령을 반복한다.
          2-1-T1-1) temp에 arr에 남은 모든 요소를 집어넣는다.
          2-1-T1-2) temp에서 숫자를 하나 뺀다.
          2-1-T1-3) permutator함수의 매개변수로 하나의 요소를 뺸 나머지 숫자들과 종이조각을 통해 만든 숫자를 사용해 2) ~ 2-1-T1-3)까지의 과정을 재귀한다.
   2-2) 만약 종이 조각들을 통해 새로운 숫자를 만들었다면
      2-2-T1) 해당 숫자를 숫자로 변경한 뒤, set안에 넣는다.
3) 문제로 주어진 숫자들을 배열로 변경해 arr_num에 저장한다
4) permutator함수에 arr_num를 넘겨주고 모든 경우의 숫자 조합을 만든다.
5) 검사할 숫자를 num으로 받는 소수인지 아닌지 검사하는 함수를 만든다.(check_prime)
   5-1) '아스트리체에라토스테네스의 체'를 사용하기 위해 검사할 숫자를 %연산할 변수 start를 만든다.
   5-2) num을 제곱한 숫자가 start보다 크다면 아래 명령을 반복한다.
      5-2-1) num이 start로 나눠 떨어지면 
          5-2-1-T1) 해당 숫자는 소수가 아님으로 false를 반환한다.
          5-2-1-F1) 다음 검사를 위해 start에 1을 더해준다.
      5-2-2) 1은 소수가 아님으로 해당 숫자가 1인지 아닌지 확인하고, 1이 아니라면 True를 반환, 1이라면 False를 반환한다.
6) 앞서 만든 숫자 조합 배열에 소수검사를 적용해서 소수인 숫자들의 갯수를 반환한다.

3. 결과 코드

function solution(numbers) {
  let primeNumbers = new Set()
  const permutator = (arr, str) => {
    if (arr.length > 0) {
      for (let i = 0; i < arr.length; i++) {
        const temp = [...arr]
        temp.splice(i, 1)
        permutator(temp, str + arr[i])
      }
    }

    if(str.length > 0){
      primeNumbers.add(Number(str))
    }
  }
  
  const arr_num = numbers.split("")
  permutator(arr_num, "")
  
  const checkPrime = (num) => {
    let start = 2
    while (start <= Math.sqrt(num)) {
      if (num % start++ < 1)
        return false
    }
    return num > 1
  }

  return new Array(...primeNumbers)
    .map((p) => { if(checkPrime(p)) return p })
    .filter(e => e != undefined)
    .length;
}