function solution(n) {
  let arr = Array(n + 1).fill(true).fill(false, 0, 2);

  for (let i = 2; i * i <= n; i++) {
    if (arr[i]) {
      for (let j = i * i; j <= n; j += i) {
        arr[j] = false;
      }
    }
  }

  return arr.filter((e) => e).length;
}

"에라토스테네스의 체" 방식을 간략하게 설명하자면 각 수의 배수에 해당하는 수는 소수가 아니므로 지운다.

ex)3,6,9가 있다면 6,9는 3의 배수가 아니므로 지워도 무방하다.

이런식으로 지워나간 후, 남아있는 수를 파악하면 그것이 소수의 개수가 된다.

function solution(n) {
  arr.splice(0, 2, false, false);

  for (let i = 2; i < n + 1; i++) {
    arr.push(i);
  }

  for (let i = 2; i * i <= n; i++) {
    if (arr[i]) {
      for (let j = i * i; j <= n; j += i) {
        arr[j] = false;
      }
    }
  }
  return arr.filter((e) => e).length;
}