소수만들기를 풀어보자
중요사항
- nums 숫자는 3개이상 50개이하
- nums는 중복된 숫자가 들어있지않음
📢소수 만들기
배열속 숫자중 3개를 뽑아 더한후 그 숫자가 소수가 되는경우의 개수를 반환
📢풀이
- 문제에서 뽑는 숫자는 3개 고정이므로
for
문 3중으로 쓰는 방법과 재귀함수 순열 알고리즘을 쓰는방법 둘을 생각했고 재귀함수를 이용하기로함 - 재귀함수로 반환된 배열을
reduce
이용해서 더함 - 소수는 1을 제외하면 본인만 나눌수있기때문에
for
문을 2부터 시작하여 나눔 - 도중에 나머지가 0이 될시
ck
증가 소수가 아니므로cnt
는유지
*forEach
로 반복하여 cnt 갯수 결과값으로 반환
코드사진
function solution(nums) {
let cnt = 0; // 소수 cnt
let arrs = getCombinations(nums,3);//재귀함수-순열 호출 3가지숫자를 배열로 변환
//forEach와 람다식 사용 val:arr[idx] 동일
arrs.forEach((val)=>{
let ck = 0;// 소수인지 여부 확인용
val = val.reduce((a,b)=>a+b); // arrs 속 배열을 합치는 용도
for(let i=2; i<val; i++){// 소수는 1,본인 이외 나눌수있는 수가없으므로 2부터 시작
if(val%i===0) { // 소수인지 확인하는 조건문
ck++;
i=val; // for문 돌아가는 와중에 나머지가 0이면 소수가 아니므로 break 대신 사용
}
}
cnt = ck===0? cnt+1 : cnt; // arrs 속 값들이 소수인지 cnt
});
return cnt;
}
// 재귀함수 - 순열 배열, 숫자
const getCombinations = (array, selectNumber) => {
const results = [];
if(selectNumber === 1){ //1개씩 선택한다면 모든 배열의 원소를 return한다.
return array.map((el) => [el]);
}
// 현재값 ,인덱스 ,배열
array.forEach((fixed, index, origin) => {
// slice: 해당 배열을 자르고 반환
// 현재 인덱스를 제외하고 돌리기위해 사용
const rest = origin.slice(index+1);
// 함수호출 현함수에서 숫자를 하나 선택했으므로 selectNumber-1
const combinations = getCombinations(rest, selectNumber - 1);
// fixed와 rest에 대한 조합을 합침
const attached = combinations.map((combination) => [fixed, ...combination]);
// 결과값을 배열에담고 반환
results.push(...attached);
});
return results;
}
📢마치며
사용한적이 있어서 기억을 할줄 알고 한건데 다 까먹었다...😂 그냥 for문을 사용할껄 예전에 노션에 적어둔걸 참고해서 재귀함수를 작성했다 자꾸 forEach
시작전 부분 하고 slice
부분을 까먹어서 결과값이 이상해지는데 요번에 공부하면서 기억 좀 했으면 좋겠다
📢출처
Author And Source
이 문제에 관하여(소수만들기를 풀어보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@asg1113/소수만들기를-풀어보자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)