혹여나 배열을 다루면서 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
comb라는 모듈이 있다니..! 신세계군요 일로 드루와