본문 바로가기
Algorithm

[프로그래머스] 소수 만들기 | Summer/Winter 코딩 테스트 | JavaScript

by Vintz 2021. 6. 17.
반응형

소수 만들기

문제 설명

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

제한 사항

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

입출력 예

nums result
[1,2,3,4] 1
[1,2,7,6,4] 4

입출력 예 설명

입출력 예 #1

[1,2,4]를 이용해서 7을 만들 수 있습니다.

 

입출력 예 #2

[1,2,4]를 이용해서 7을 만들 수 있습니다.

[1,4,6]을 이용해서 11을 만들 수 있습니다.

[2,4,7]을 이용해서 13을 만들 수 있습니다.

[4,6,7]을 이용해서 17을 만들 수 있습니다.

문제 풀이

배열 안의 서로 다른 숫자 3개 더하기

처음엔 배열 메서드로 풀려고 했지만 결국 실패하고 3중 for문을 사용했다. 배열 안의 서로 다른 숫자를 골라 더하는 것은 서로 다른 인덱스를 골라 더하는 것과 같다. 즉, 길이가 4인 배열의 경우 인덱스 0+1+2, 0+1+3, 0+2+3, 1+2+3의 값을 구해 소수를 판별하면 된다.

let nums = [1,2,3,4];
let len = nums.length;

for(let i = 0; i < len; i++) {
    for(let j = i+1; j < len; j++) {
    	for(let k = j+1; k < len; k++) {
            const sum = nums[i] + nums[j] + nums[k];
            console.log(sum);
        }
    }
}

sum 결과값

소수 판별 함수 구하기

구글에 'prime number js'를 검색하면 가장 위에 스택 오버 플로우 글이 있다. 소수 판별 함수를 여기서 쉽게 찾을 수 있었다.

이미지 출처 - https://stackoverflow.com/questions/40200089/number-prime-test-in-javascript

코드

function solution(nums) {
    let answer = 0;
    const len = nums.length;
    
    for(let i = 0; i < len; i++) {
        for(let j = i+1; j < len; j++) {
            for(let k = j+1; k < len; k++) {
                const sum = nums[i] + nums[j] + nums[k];
                if(isPrime(sum)) answer++;
            }
        }
    }
    return answer;
}

function isPrime(sum) {
    for(let i = 2; i < sum; i++)
    if(sum % i === 0) return false;
    return sum > 1;
}

 

반응형