Sieve of Eratosthenes

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 (Sieve of Eratosthenes) λΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ€ μ†ŒμŠ€λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ 일쒅이닀.

μ—λΌν† μŠ€ν…Œλ„€μŠ€

μ†Œμˆ˜κ°€ μ•„λ‹Œ 수λ₯Ό κ±°λ₯΄λŠ” λ°©λ²•μœΌλ‘œ 2 λΆ€ν„° N-1 κΉŒμ§€μ˜ μˆ˜μ€‘μ—μ„œ 2의 배수λ₯Ό λͺ¨λ‘ 체에 κ±°λ₯΄λŠ” μ‹μœΌλ‘œ λ™μž‘λœλ‹€.

  • 2 의 배수λ₯Ό μ²΄ν¬ν•œλ‹€.
  • 3 의 배수λ₯Ό μ²΄ν¬ν•œλ‹€.
  • 4 λŠ” 2의 λ°°μˆ˜μ—μ„œ μ²΄ν¬ν–ˆμœΌλ‹ˆ μ†Œμˆ˜κ°€ μ•„λ‹ˆλ‹€.
  • 5 의 배수λ₯Ό μ²΄ν¬ν•œλ‹€.
  • μ΄λŸ°μ‹μœΌλ‘œ μ²΄ν¬ν•˜μ—¬ 체크가 λ˜μ§€ μ•ŠλŠ” μˆ˜λ“€μ΄ μ†Œμˆ˜μ΄λ‹€.

μ•„λž˜λŠ” νŠΉμ • 숫자의 μ†Œμˆ˜μ˜ 갯수λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

/**
  * μ—λΌν† λ…ΈμŠ€μ˜ 체
  * @param n
  * @return
  */
public static int solution(int n) {
  boolean[] b = new boolean[n + 1];
  int answer = 0;

  for (int i = 2; i <= n; ++i) {
    if (b[i] == false) {
      answer++;
      for (int j = i; j <= n; j += i) {
        b[j] = true;
      }
    }
  }

  return answer;
}