λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

ν”„μ—” 곡뢀/🫧 μ•Œκ³ λ¦¬μ¦˜ 곡뢀

[μ•Œκ³ λ¦¬μ¦˜ || ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] πŸ”μ†Œμˆ˜ μ°ΎκΈ°

728x90

 

μ˜€λŠ˜μ€ μ‹œκ°„μ˜ ν•œκ³„λ₯Ό λͺ»λ„˜μ–΄μ„œ λΉ„λ‚œλ‹˜μ˜ μ½”λ“œλ₯Ό 보고 κ³΅λΆ€ν•˜λŠ” μ‹œκ°„μœΌλ‘œ λŒ€μ²΄ν–ˆλ‹€. 

μ²˜μŒμ—” for 문으둜 1, 2, λ₯Ό μ œμ™Έν•œ μ΄ν›„μ˜ μˆ«μžλΆ€ν„° μ•½μˆ˜μ˜ 개수λ₯Ό 세어보고 μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ νŒλ³„ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν’€μ—ˆλŠ”λ°, 

λ²”μœ„κ°€ λ„ˆλ¬΄ λ§Žμ•˜λŠ”μ§€ μ‹œκ°„μ΄ˆκ³Όλ‘œ ν†΅κ³Όλ˜μ§€ λͺ»ν–ˆλ‹€.

 

μ΄λ ‡κ²Œ μ œκ³±κ·Όμ„ μ΄μš©ν•˜λ©΄ 훨씬 더 적은 λ²”μœ„ λ‚΄μ—μ„œ μ•½μˆ˜λ₯Ό ꡬ할 수 μžˆλ‹€. 

μ–΄μ°¨ν”Ό μ•½μˆ˜λŠ” 두 수의 곱으둜 이뀄지기 λ•Œλ¬Έμ— 16의 μ•½μˆ˜μΈ 2λ₯Ό κ΅¬ν–ˆλ‹€λ©΄ μžλ™μœΌλ‘œ 8도 μ‘΄μž¬ν•˜λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€.

 

 

λΉ„λ‚œλ‹˜μ˜ μ½”λ“œλ₯Ό 보면 μ†Œμˆ˜λ₯Ό κ΅¬ν•œλ‹€κΈ° 보단, 

μ†Œμˆ˜κ°€ μ•„λ‹Œ 수λ₯Ό μ†Œκ±°ν•΄μ£ΌλŠ” 방식을 μ±„νƒν•˜κ³  μžˆλ‹€.

function solution(n) {
    let isPrime = new Array(n + 1).fill(true).fill(false, 0, 2)
    for (let i = 2; i <= Math.sqrt(n); i++) {
        if (isPrime[i]) {
            for (let j = i * i; j <= n; j += i) {
                isPrime[j] = false
            }
        }
    }
    return isPrime.filter(Boolean).length;
}

μ²˜μŒμ—” 잘 이해가 μ•ˆκ°”μ§€λ§Œ, 

ν•˜λ‚˜μ”© 보며 예제λ₯Ό λŒλ €λ³΄λ‹ˆ 이해가 κ°”λ‹€.

 

λ¨Όμ € isPrime μ΄λž€ 배열을 λ§Œλ“€μ–΄μ£ΌλŠ”λ°, n 보닀 ν•˜λ‚˜ λ”ν•œ 길이둜 λ§Œλ“€μ–΄μ€€λ‹€. 

μ΄λŠ” for λ¬Έμ—μ„œ index 와 i λΌλŠ” μ•½μˆ˜λ₯Ό μΌμΉ˜μ‹œν‚€κΈ° μœ„ν•¨μ΄λ‹€. 

 

true 둜 μ±„μš΄ λ°°μ—΄μ—μ„œ μ†Œμˆ˜κ°€ μ•„λ‹Œ κ²ƒλ“€λ§Œ false 둜 λ°”κΏ”μ€€λ‹€.

μ²˜μŒμ— index 0, 1 λŠ” μ†Œμˆ˜κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— falseλ‹€.

 

그럼 μ²˜μŒμ—” 2κ°€ true μ΄λ―€λ‘œ

μ•ˆμͺ½μ— μžˆλŠ” for 문을 돌며 2*2 λΆ€ν„° 2의 λ°°μˆ˜λ“€μ΄ false κ°€ λœλ‹€. (4, 6, 8, 10,,,) 

κ·Έ λ‹€μŒμ€ 3*3 λΆ€ν„° 3의 λ°°μˆ˜λ“€μ΄ false κ°€ λœλ‹€. (9, 12, 15, 18, 21,,,)

μ΄λŸ°μ‹μœΌλ‘œ λ‹€μŒμ€ 5, 7, λ“±μœΌλ‘œ μ†Œμˆ˜κ°€ μ•„λ‹Œ μˆ«μžλ“€μ΄ μ†Œκ±°λœλ‹€. 

 

μ „λΆ€ μ†Œκ±°λœ λ°°μ—΄μ—μ„œ true 인 μš”μ†Œλ§Œ filter 둜 κ±ΈλŸ¬μ€€ λ°°μ—΄μ˜ length κ°€ n κΉŒμ§€μ˜ μ†Œμˆ˜μ˜ κ°œμˆ˜κ°€ λœλ‹€. 

 

μ†Œκ±°λ²• λ―€μ°Œλ‹€!

 

728x90
λ°˜μ‘ν˜•