https://programmers.co.kr/learn/courses/30/lessons/12977
일부 테스트케이스만 통과
function solution(nums) {
var answer = [];
var sums = [];
//숫자 세개를 고르는 함수 (조합)
const combination = (nums,selectNum) => {
const result = [];
if(selectNum===1) return nums.map((v)=>[v]);
nums.forEach((v,idx,nums)=>{
const fixed = v;
const restArr = nums.slice(idx+1);
const combinationArr = combination(restArr,selectNum-1);
const combineFix = combinationArr.map((v)=>[fixed,...v]);
result.push(...combineFix);
});
return result;
}
const threeNums = combination(nums,3);
//세 숫자를 합하고, 배열 sums에 합을 push한다
const add = (arr)=>{
for(let i=0;i<arr.length;i++){
const sum = arr[i][0]+arr[i][1]+arr[i][2]
if(!sums.includes(sum)){ //배열 sums에 동일한 값이 존재하지 않을때만 push하기
sums.push(sum);
}else{
continue;
}
}
}
add(threeNums);
//소수인지 확인하는 함수
function isPrime(num) {
let sqrt = parseInt(Math.sqrt(num));
if (num === 1) {return false;}
if (num === 2) {return true;}
if (num % 2 === 0) {return false;}
for (let i = 3; i <= sqrt; i += 2) {
if (num % i === 0) {return false;}
}
return true;
}
const listPrime = (arr) =>{
for(let i=0;i<arr.length;i++){
if(isPrime(arr[i])){
answer.push(arr[i]);
}else{
continue;
}
}
}
listPrime(sums);
return answer.length;
}
위와 같이 풀었을때 100개의 테스트케이스 중 23개 정도만 통과했다. 질문을 보니 나와 같은 경우가 많았다. 결과적으로 add 함수
에서 문제가 발생한 거였다.
if(!sums.includes(sum)){
sums.push(sum)
}else{
continue
}
이 부분에서 sums 배열에 이미 sum값이 존재하면 푸시하지 않았다. 그런데, 뽑은 세개의 숫자의 합이 같더라도, 조합이 다르기 때문에 배열에 존재하더라도 푸시해줘야한다. 예를 들어,
[1,2,3,4,5,6,7,8,9,10]
에서 세개의 숫자를 골라서 1+2+10
이 13
이고,1+3+9
,1+4+7
등의 경우의 수도 모두 13
이다. 따라서 모두 합이 13이더라도, 다른 경우의 수로 만들어진 합이기 때문에 카운트해줘야한다.
따라서 다음과 같이 수정해주면 모든 테스트케이스를 통과한다
모든 테스트케이스 통과
function solution(nums) {
var answer = [];
var sums = [];
//숫자 세개를 고르는 함수
const permutation = (nums,selectNum) => {
const result = [];
if(selectNum===1) return nums.map((v)=>[v]);
nums.forEach((v,idx,nums)=>{
const fixed = v;
const restArr = nums.slice(idx+1);
const permutationArr = permutation(restArr,selectNum-1);
const combineFix = permutationArr.map((v)=>[fixed,...v]);
result.push(...combineFix);
});
return result;
}
const threeNums = permutation(nums,3);
//세 숫자를 합하는 함수
const add = (arr)=>{
for(let i=0;i<arr.length;i++){
const sum = arr[i][0]+arr[i][1]+arr[i][2];
sums.push(sum);
}
}
add(threeNums);
//소수인지 확인하는 함수
function isPrime(num) {
let sqrt = parseInt(Math.sqrt(num));
if (num === 1) {return false;}
if (num === 2) {return true;}
if (num % 2 === 0) {return false;}
for (let i = 3; i <= sqrt; i += 2) {
if (num % i === 0) {return false;}
}
return true;
}
const listPrime = (arr) =>{
for(let i=0;i<arr.length;i++){
if(isPrime(arr[i])){
answer.push(arr[i]);
}else{
continue;
}
}
}
listPrime(sums);
return answer.length;
}