코딩테스트

[JS] Summer/Winter Coding(~2018) > 소수 만들기

차차한 2022. 8. 16. 13:47

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

let sieve = new Array(2997).fill(true);

for (let i = 2; i * i < sieve.length; i += 1) {
  if (!sieve[i]) continue;
  for (let j = i + i; j < sieve.length; j += i) {
    sieve[j] = false;
  }
}

console.log(sieve);
function solution(nums) {
  var answer = 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++) {
        const index = nums[i] + nums[j] + nums[k];
        if (sieve[index]) {
          answer += 1;
        }
      }
    }
  }

  return answer;
}

이번 문제는 혼자 풀지 못 하고 다른 사람 풀이를 참고했다.

소수를 구하기 위해 '에라토스테네스의 체'라는 알고리즘을 사용해야 하는데 코드를 보고 풀어보려해도 풀리지 않았기 때문에..

알고리즘을 공부한 후 다시 문제를 풀어봤다.

에라토스테네스의 체 알고리즘은 주어진 배열만큼 모두 소수를 뜻하는 'true'로 변경한 후,

해당 인덱스의 값이 2,3,5,... 등의 배수일 경우 값을 false로 변경해준다.

그 후에 true의 개수를 구하면 소수의 개수가 몇 개인지 알 수가 있다!

 

위의 코드에서 배열의 길이를 2997로 준 것은 3개의 숫자가 1~1000까지의 숫자이지만 세 숫자는 중복되지 않기 때문에 최대값인 2997로 설정을 했다.

false 즉 소수가 아닌 경우는 for 반복을 타지 않고 true(소수)인 경우에만 반복을 타면서 i의 배수를 모두 false로 만들어 준다.

그렇게 소수인 숫자만 true로 변경한 후에 그 숫자를 계산하면 된다.