combinations-generator

서기영·2022년 4월 19일
1

혹여나 배열을 다루면서 2개 이상의 데이터를 뽑는 모든 경우의 수를 구하는 방법에 대해 고민해 본 적이 있을 것이다.

프로그래머스 문제를 통해 위 문제에 대한 궁금증을 해결해보자!

**문제 설명**
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 
숫자들이 들어있는 배열 array가 매개변수로 주어질 때, array에 있는 숫자들 중 서로 다른 
3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
function primeCount(array) {
    //소수 판별 함수
    function isPrime(n) {
        for (let i = 2; i < n; i++) {
            if (n%i===0) return false
        }
        return true
    }

    let result = 0; // 소수를 뽑는 경우의 수
    
    // 중복되지 않게 array에서 3가지 수를 뽑는 함수
    for (let i = 0; i < array.length; i++) {
        for (let j = i + 1; j < array.length; j++) {
            for (let k = j + 1; k < array.length; k++) {
                let sum = array[i] + array[j] + array[k];
                if (isPrime(sum)) { // 뽑은 세 수의 합이 소수일때
                   result++
                }
            }
        }
    }
    return result
}

for문 중첩을 통해 배열에서 3개의 데이터를 뽑는 모든 경우의 수를 나열할 수 있었다.
하지만 그 수가 4개, 5개 그 이상으로 늘어난다면 어떻게 할까?

nodejs에서는 combinations-generator란 모듈을 지원하고 있다.
그 사용법은 아래와 같다.

var comb = require("combinations-generator");

function primeCount(array) {
    function isPrime(n) {
        if (n===2 || n===3) return true
        if (n%2===0) return false
        for (let i = 3; i < parseInt(n/2) + 1; i+=2) {
            if (n%i===0) return false
        }
        return true
    }
    let iterator = comb(array,3);
    let result = 0;
    for (let item of iterator){
        let sum = item[0] + item[1] + item[2];
        if (isPrime(sum)) {
            result++;
        }
    };
    return result
}

comb([배열], 뽑을 갯수)로 사용하면 iterator변수에 모든 경우의 수가 차례대로
generator에 저장된다.

참고자료 https://programmers.co.kr/learn/courses/30/lessons/12977?language=javascript

profile
진정한 배움은 가르침과 기록을 오가며 실현된다.

1개의 댓글

comment-user-thumbnail
2022년 4월 19일

comb라는 모듈이 있다니..! 신세계군요 일로 드루와

답글 달기

관련 채용 정보