알고리즘 소수만들기

문제 설명

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

제한사항

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

조합을 사용해서 풀면 확장성이 좋은데 재귀함수 부분에서 이해가 안되서 for문을 돌려서 풀었다... 조합은 좀더 공부해서 추가할 예정!..

function solution(nums) {
  var answer = 0;
  let sums = [];
  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++) {
        sums.push(nums[i] + nums[k] + nums[j]);
      }
    }
  }

  sums.forEach((sum) => {
    if (checkSum(sum)) answer++;
  });

  return answer;
}
function checkSum(num) {
  for (let i = 2; i < num; i++) {
    if (num % i === 0) return false;
  }
  return true;
}
  1. 3개더한 합을담는 sums array를 만든다
  2. for문 돌면서 push 해준다
  • i+1, j+1 이런식으로 짠건 중복되는 경우는 더해서 sums에 넣어줄 필요 없기 때문이다 1,2,3 더하나 3,2,1더하나 같기때문
  1. sums 를 돌면서 소수인지 아닌지 확인해준다 true를 return 하면 answer에 1을 더해준다
  2. 소수는 1과 자기자신을 제외하고는 나누어떨어지지 않는 수 이므로
    2부터 자기자신 전까지 돌면서 나머지가 0인지 아닌지 확인해야 한다
    하나라도 나누어 떨어지면 return false해서 함수를 종료시켜준다
    다 통과하면 return true해준다
  • 소수판별함수에서 for문 돌 때 제곱근을 사용할 수 있는데 아직 이해가 되지 않아서 전달받은 숫자 앞까지 돌았다

좋은 웹페이지 즐겨찾기