소수 찾기

원지렁·2023년 3월 21일
0

알고리즘 정복기

목록 보기
8/12
post-thumbnail

소수 찾기

문제

숫자로 이루어진 문자열 numbers가 주어졌을 때 (ex. '17') numbers에 해당하는 숫자들의 조합으로 만들 수 있는 숫자 중 소수의 갯수를 리턴해야 함 (ex.7, 17, 71)

문제의 핵심

1) 숫자들의 조합을 만들어 리턴하는 함수 생성(getPermutations)
: 숫자를 조합할 때 순서도 영향을 미치기 때문에 순열 함수를 만든다 (ex. 17, 71은 다른 숫자임)

2) 소수를 판별하는 함수 생성(isPrime)

  • 나의 풀이
function solution(numbers) {
	
  	// numbers를 한자릿 수로 분리
    const numbersArr = numbers.split('');
  	// 1가지를 조합하여 만들 수 있는 경우의 수를 미리 넣어둠
    let primesArr = [...numbersArr];
  	// 만들 수 있는 수들의 조합을 넣는 배열 선언
    let combiNums = [];
  	// 조합의 갯수를 count할 answer변수 선언
    let answer = 0;

  	// numbersArr와 요소를 선택할 갯수인 selectNumber를 인자로 받아 순열을 리턴하는 함수
    const getPermutations = function(arr, selectNumber){
        const result = [];
        if(selectNumber === 1) return arr.map((el) => el);

        arr.forEach((fixed, index, origin) => {
            const rest = [...origin.slice(0, index), ...origin.slice(index + 1)];
            const permutations = getPermutations(rest, selectNumber - 1);
            const attached = permutations.map((el) => fixed + el);
            result.push(...attached);
        })
        return result;
    }

    // 소수판별 함수
    const isPrime = function(num){
      // num === 0,1인 경우 예외 처리
        if(num <= 1){
        return false;
    }
    // num의 제곱근까지 반복문을 돌림으로써 코드 효율성 개선  
    for(let j = 2; j <= Math.sqrt(num); j++){
        if(num % j === 0){
            return false;
        }
    }
    return true;
    }

    // 만들 수 있는 모든 순열의 갯수를 구하기 위해 반복문을 돌며 getPermutations 실행하여 primesArr에 넣음
    for(let i = 2; i <= numbersArr.length; i++){
        combiNums = getPermutations(numbersArr, i);
        primesArr.push(...combiNums);
    }

  	// primesArr 요소 숫자로 변횐
    primesArr = primesArr.map((el) => parseInt(el));
  	// Set를 이용한 중복 숫자 제거
    primesArr = [...new Set(primesArr)];

  	// primesArr 요소들이 소수인지 판별하여 answer 카운트
    for(el of primesArr){
        if(isPrime(el)){
            answer++;
        }
    }
    return answer;
}
profile
새싹 개발자 지렁이의 벨로그입니다.

0개의 댓글