하루살이 개발일지

[Algorithm] 소수 만들기 본문

알고리즘

[Algorithm] 소수 만들기

harusari 2023. 6. 19. 18:04

문제 설명

주어진 숫자 중 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을 만들 수 있습니다.


첫 번째 시도 (정답이나 아쉬움)

const solution = (nums) => {
  let result = [];

  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++) {
        result.push([nums[i], nums[j], nums[k]]);
      }
    }
  }

  // point : 배열 안 요소를 모두 더한 새로운 배열 내뱉기
  // [...acc, sum]으로 return해주는 부분이 포인트
	// 하지만 result에 push할 때 그냥 더해서 넣어줬으면 될 일
  result = result.reduce((acc, cur) => {
    let sum = cur.reduce((a, c) => a + c, 0);
    return [...acc, sum];
  }, []);

  result = result.filter((e) => {
    if (e < 2) return false;
    for (let i = 2; i < e; i++) {
      if (e % i === 0) {
        return false;
      }
    }
    return true;
  });

  return result.length;
};

두 번째 시도 (정답이나 살짝 개선할 부분이 있음)

const solution = (nums) => {
  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[j] + nums[k]);
      }
    }
  }

  sums = sums.filter((e) => {
    // 개선 : for(let i = 2; i <= Math.sqrt(e); i++) 로 고칠 수 있음
    for (let i = 2; i < e; i++) {
      if (e % i === 0) return false;
    }
    return true;
    // 현재는 자연수의 합이라 이 부분이 그냥 return true여도 상관 없지만,
    // 만약 1보다 작은 수가 들어오면 false를 리턴해야 함
    // return e > 1;이 좀 더 많은 케이스 대비 가능
  });

  return sums.length;
};

세 번째 시도(정답)

const solution = (nums) => {
  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[j] + nums[k]);
      }
    }
  }

  // 소수 판별 로직
  sums = sums.filter((e) => {
    for (let i = 2; i <= Math.sqrt(e); i++) {
      if (e % i === 0) return false;
    }
    return e > 1;
  });

  return sums.length;
};