μ•Œκ³ λ¦¬μ¦˜/νƒœκ·Έ 별 풀이

[μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체]μ†Œμˆ˜μ°ΎκΈ°

choi95 2021. 10. 9. 01:51

문제

문제 μ„€λͺ…

1λΆ€ν„° μž…λ ₯받은 숫자 n 사이에 μžˆλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 λ§Œλ“€μ–΄ λ³΄μ„Έμš”.

μ†Œμˆ˜λŠ” 1κ³Ό 자기 μžμ‹ μœΌλ‘œλ§Œ λ‚˜λˆ„μ–΄μ§€λŠ” 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
(1은 μ†Œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.)

μ œν•œ 쑰건

  • n은 2이상 1000000μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

nresult

10 4
5 3

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
1λΆ€ν„° 10 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5,7] 4κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 4λ₯Ό λ°˜ν™˜

μž…μΆœλ ₯ 예 #2
1λΆ€ν„° 5 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5] 3κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 3λ₯Ό λ°˜ν™˜

 

λ¬Έμ œν’€μ΄

https://choi95.tistory.com/50

 

뒀집은 μ†Œμˆ˜

문제 N개의 μžμ—°μˆ˜κ°€ μž…λ ₯되면 각 μžμ—°μˆ˜λ₯Ό 뒀집은 ν›„ κ·Έ 뒀집은 μˆ˜κ°€ μ†Œμˆ˜μ΄λ©΄ κ·Έ μ†Œμˆ˜λ₯Ό 좜λ ₯ν•˜κ³ μž ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 32λ₯Ό λ’€μ§‘μœΌλ©΄ 23이고, 23은 μ†Œμˆ˜μ΄λ‹€. 그러면 23을 좜λ ₯ν•œλ‹€.(첫 μžλ¦¬λΆ€ν„°μ˜

choi95.tistory.com

μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 연산은 일전에 ν’€μ—ˆλ˜ 뒀집은 μ†Œμˆ˜ λ¬Έμ œμ™€ κ°™μ•˜λ‹€.

 

μ½”λ“œ

function isPrime(n) {
    for(let i = 2; i <= Math.sqrt(n); i++) {
        if(n % i === 0) return false;
    }
    return true;
}

function solution(n) {
    var answer = 0;
    for(let i = 2; i <= n; i++) {
        if(isPrime(i)) answer++;
    }
    return answer;
}

 

μ˜€λ‹΅

ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ κ²°κ³Ό

정확도 ν…ŒμŠ€νŠΈλŠ” λͺ¨λ‘ λ‹€ λ§žμ³€μœΌλ‚˜ νš¨μœ¨μ„± ν…ŒμŠ€νŠΈμ—μ„œ μ‹œκ°„ 초과둜 μ˜€λ‹΅μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆλ‹€.

ꡬ글링해본 κ²°κ³Ό μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μ€„μ—¬μ•Όλ§Œ νš¨μœ¨μ„± ν…ŒμŠ€νŠΈλ₯Ό 톡과할 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.

 

μ—λΌν† μŠ€λ„€μŠ€μ˜ 체

  • μ£Όμ–΄μ§„ 숫자 κ°’μ˜ λ²”μœ„ μ•ˆμ—μ„œ, 자기 μžμ‹ μ„ μ œμ™Έν•œ 배수 값을 μ‚­μ œ
  • μœ„ μ—°μ‚° κ³Όμ • ν›„ μ†Œμˆ˜λ§Œ λ‚¨κ²Œ 됨
  • μž…λ ₯ 받은 μˆ«μžκΉŒμ§€μ˜ μ •μˆ˜ 쀑 μ†Œμˆ˜μ˜ 개수λ₯Ό ꡬ해야 ν•  κ²½μš°μ— 용이

μ—λΌν† μŠ€λ„€μŠ€μ˜ 체

 

 

μ½”λ“œ

let solution = (n) => {
    let arr = Array(n+1).fill(1).fill(0, 0, 2); //μ†Œμˆ˜μ˜ 쑰건이 μ•„λ‹Œ 0κ³Ό 1은 사전에 false

    for(let i=2; i*i<=n; i++){
        if(arr[i]){ //μ•žμ„œ 배수의 μ—°μ‚° κ³Όμ •μ—μ„œ κ΅¬ν•΄μ‘Œλ‹€λ©΄
            for(let j=i*i; j<=n; j+=i){ //배수 κ³±ν•˜κΈ°
                arr[j] = 0;
            }
        }
    }
    return arr.filter((e, _) => e).length;
}