소수만들기를 풀어보자

JD·2021년 10월 18일
0

중요사항

  • 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부분을 까먹어서 결과값이 이상해지는데 요번에 공부하면서 기억 좀 했으면 좋겠다

📢출처

👍프로그래머스

0개의 댓글