알고리즘-2021/05/05

sanghun Lee·2021년 5월 5일
0

알고리즘

목록 보기
41/52
post-thumbnail

문제 설명

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

입출력 예

nums	result
[1,2,3,4]	1
[1,2,7,6,4]	4
입출력 예 설명
입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.

풀이

function solution(nums) {
    let sumArr = [];
    let count = 0;
    //세가지 수를 더한 모든 경우를 담는 배열
    for(let i = 0; i < nums.length; i++){
      for(let j =i+1; j < nums.length; j++){
        for(let k = j+1; k <nums.length; k++){
            sumArr = sumArr.concat(nums[i]+nums[j]+nums[k]);
        }
      }
    }


    //소수가 아닌 것들을 담는 배열
    let noPrime = [];
    console.log(sumArr);
    sumArr.forEach((el,index)=>{
      for(let i = 2; i*i <= el; i++){
          if(el % i === 0 && el !== i){
            return noPrime.push(el);
          }
      }
    })

    return sumArr.length - noPrime.length;
}

우선 세가지 수를 더한다는 조건이 있으므로 .. 삼중 ㅎㅅㅎ... 반복문을 하되 인덱스를 얹어주는 방식으로 경우의 수를 적게나마 만들려 노력했다.

두번째로는 소수를 찾는 로직을 실행했고 2~제곱근보다 작거나 같은 범위 까지 실행하며 2이상의 숫자로 나눠지는 경우 별도의 배열에 담아버리며 return을 시켜 소수가 아닌 숫자들을 담는 배열이 이루어졌다.

처음에는 중복을 피하려 SET자료형을 통해 중복을 제거하였으나 테스트케이스가 대부분 통과되지 않아 생각을 해보니 경우의 수를 구하는 문제이므로 합의 값이 중복되었다고 해도 그것을 구성하는 수가 다른 경우가 있을 것이라는 생각에 도달했고 중복 케이스를 넣고 돌리니 해결되었다.

끝!

참고

profile
알고리즘 풀이를 담은 블로그입니다.

0개의 댓글