[프로그래머스] 소수 만들기 - JavaScript

coderH·2022년 3월 27일
1

프로그래머스코테

목록 보기
8/27
post-thumbnail

프로그래머스 소수 만들기

문제

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며,
중복된 숫자가 들어있지 않습니다.

정답

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

function solution(nums) {
    let answer = 0;

    for(let i = 0; i < nums.length; i++) {
        for(let j = i + 1; j < nums.length; j++) {
            for(let k = j + 1; k < nums.length; k++) {
                let target = nums[i] + nums[j] + nums[k];
                if(checkPrime(target)) {
                    answer++;
                }
            }
        }
    }
    
    return answer;
}

풀이

문제에 나와있듯이 3개씩 조합이 가능한 모든 수 중 소수가 되는 수의 개수를 찾아야 하기 때문에 숫자 조합이 가능한 모든 경우의 수를 반영해야 해서 완전탐색을 해야합니다.
그래서 for문을 3중으로 사용하여 조합 가능한 모든 수를 탐색하고
조합된 숫자가 소수가 아니라면 count변수에 반영되지 못하도록 하였습니다.

정답 개선

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

function solution(nums) {
    let answer = 0;

    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 target = nums[i] + nums[j] + nums[k];
                if(target % 2 !== 0 && checkPrime(target)) {
                    answer++;
                }
            }
        }
    }
    
    return answer;
}

많은 변화는 없지만
i와 j가 있는 for문의 경우 숫자 조합의 1번째, 2번째 숫자를 담당하므로 끝까지 돌 필요는 없어 각각 nums.length가 필요한만큼만 반복되도록 -1, -2를 적용하였고
조합된 숫자의 짝수 판별을 checkPrime함수를 호출하기전에 판단하도록 하여
checkPrime함수의 불필요한 호출을 줄이고 함수 내부의 가독성을 더 좋게 개선하였습니다.

0개의 댓글