π 12921 μμ μ°ΎκΈ°
https://school.programmers.co.kr/learn/courses/30/lessons/12921
1. λ¬Έμ μμ½
- 1λΆν° μ λ ₯λ°μ μ«μ n μ¬μ΄μ μλ μμμ κ°μ λ°ννλ ν¨μ μμ±νκΈ°
- μμ : 1κ³Ό μκΈ° μμ μΌλ‘λ§ λλμ΄μ§λ μ
2. μ κ·Όλ°©λ²
- boolean[] isPrime λ°°μ΄ λ§λ€μ΄μ κ° μκ° μμμΈμ§ μλμ§ μ²΄ν¬
β λ³΄ν΅ μμ νλ³νλ λ©μλλ λ°°μ΄μ isPrimeμΌλ‘ λ³μ λͺ λͺ νκΈ° - μ²μμ 2 μ΄μ λͺ¨λ μ μμλΌκ³ κ°μ νκ³ μμνκΈ°
β 0, 1μ μμκ° μλκΈ° λλ¬Έμ΄λ€ - 2 ~ λ£¨νΈ nκΉμ§ λλ©΄μ λ°°μ μ κ±°νκΈ°
- μ΅μ’ μ μΌλ‘ trueλ‘ λ¨μ μλ μλ€μ μΉ΄μ΄νΈνλ©΄ κ·Έκ² μμ κ°μ
3. μ λ₯μ½λ
class Solution {
public int solution(int n) {
boolean[] isPrime = new boolean[n + 1];
// μ²μμλ λͺ¨λ trueλ‘ λκ³ 0. 1μ μμκ° μsλλκΉ μ μΈ
for (int i = 2; i <= n; i++) {
isPrime[i] = true;
}
// μλΌν μ€ν
λ€μ€μ 체
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
// μμ κ°μ μΈκΈ°
int count = 0;
for (int i = 2; i <= n; i++) {
if (isPrime[i]) count++;
}
return count;
}
}
μλΌν μ€ν λ€μ€μ 체μμ λ²μκ° i*i <= nκΉμ§λ§ μννλ©΄ λλ μ΄μ ?
- μ°λ¦¬κ° μμ νλ³μ ν λ iλ₯Ό μμλΌκ³ κ°μ νκ³ λ°°μλ₯Ό μ§μ λκ°λ€
- μ¬κΈ°κΉμ§λ§ κ²μ¬νλ μ΄μ λ λ£¨νΈ nμ΄νμ μλ μ΄μ μμ μμλ€μ λ°°μμμ λ€ κ±Έλ¬μ‘κΈ° λλ¬Έμ΄λ€.
ν©μ±μμ νΉμ§
μ΄λ€ μ nμ΄ ν©μ±μλΌλ©΄, n = a * b κΌ΄λ‘ λνλΌ μ μλ€. μ΄ λ a μ b μ€ μ μ΄λ νλλ λ£¨νΈ n μ΄νμ΄λ€.
- 36 = 6 * 6
- 91 = 7 * 13
- μ¦, λ£¨νΈ nκΉμ§λ§ κ²μ¬νλ©΄ λͺ¨λ ν©μ±μμ μ½μ μ‘°ν©μ 컀λ²ν μ μλ€.
(int j = i * i; j <= n; j += i μμ i*i λΆν° κ²μ¬νλ μ΄μ
- i * iλ nμ μ κ³±κ·Όμ μλ―Ένλ€.
- κ·Έλ¦¬κ³ i * i μ΄μλΆν°κ° μμ§ μ μ§μμ§ μλ‘μ΄ λ°°μμ΄κΈ° λλ¬Έμ΄λ€.
- μ΄λ κ² νλ©΄ μ€λ³΅ μ°μ°μ μ€μΌ μ μλ€.
μλ₯Ό λ€λ©΄, n = 30μΌ λ
- i = 2λΌλ©΄ 4, 6, 8, ... , 30 μ§μμ§
- i = 3μΌλ 9, 12, 15, ..., 30 μ§μμ§
λ§μ½μ μ¬κΈ°μ i=6 λΆν° μμνλ©΄
μ΄λ―Έ 6μ λ°°μλ μμμ λ€ μ§μμ§ 12, 18, 24, 30μ λ€ μ§μμ‘κΈ° λλ¬Έμ
λ°λΌμ i = 6μ΄νλ‘λ μλ‘κ² μ§μΈ κ² μλ€ κ·Έλμ i * i λΆν° μ§μ°λ©΄ λλ€.