[프로그래머스 | Javascript] 소수 만들기

박기영·2022년 9월 12일
0

프로그래머스

목록 보기
36/159
post-custom-banner

solution

function solution(nums) {    
    let sums = [];
    
    // 세수의 합을 구해보자
    // 각각 for문이 내부로 갈 수록 그 전 연산자에 +1 한 값으로 시작하기 때문에
    // 겹치지 않는다.
    for(let i = 0; i < nums.length - 2; i++){
        for(let j = i + 1; j < nums.length - 1; j++){
            for(let k = j + 1; k < nums.length; k++){
                // 세 숫자의 합
                let sum = nums[i] + nums[j] + nums[k];
                
                // sum들의 집합을 만든다.
                sums.push(sum);                
            }
        }
    }
    
    // sums 원소 중 최댓값을 찾는다.
    let max = Math.max(...sums);
    
    // max까지의 소수 구하기
    let isPrime = new Array(max + 1).fill(true);
    
    isPrime[0] = false;
    isPrime[1] = false;
    
    for(let i = 2; i*i <= max; i++){
        if(isPrime[i]){
            // 소수의 배수는 소수가 아니므로, 그 것들을 찾아내기 위해 곱 연산 진행
            let multiple = 2;
    
            // 연산은 n보다 작을 때까지 진행할 것
            while(i * multiple <= max){
                isPrime[i * multiple] = false;
      
                multiple++;
            }
        }
    }
    
    // 소수인 개수를 체크하는 카운트
    let count = 0;
    
    for(let i = 0; i < sums.length; i++){
        if(isPrime[sums[i]]){
            count++;
        }
    }
    
    return count;
}

세 숫자의 합을 구현하는 것과 소수 판별을 위한 배열을 만드는 것이 관건이다.
둘 중 하나라도 못하면 못 푼다.

세 숫자의 합을 구하는 것은 for문을 여러번 사용해서 쉽게 구현할 수 있다.
여기서 구한 합은 sums 배열에 넣어놓는다.

에라토스테네스의 체 방식을 사용하여 소수 판별 배열을 만들었다.

isPrime 배열은 인덱스 번호가 곧 자연수를 의미한다.
따라서 sums의 배열 원소를 isPrime의 인덱스로 사용하면
sums의 그 숫자가 소수인지 아닌지 판별할 수 있다.

소수가 맞다면 count를 증가시키고
최종적으로 연산이 끝난 count를 출력한다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글