CS/Algorithm

[μ•Œκ³ λ¦¬μ¦˜] μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

개발개꡴🐸 2022. 8. 1. 19:44

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λž€?

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ *μ†Œμˆ˜(Prime Number) νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, μ†Œμˆ˜λ₯Ό λŒ€λŸ‰μœΌλ‘œ λΉ λ₯΄κ³  μ •ν™•ν•˜κ²Œ κ΅¬ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

 

*μ†Œμˆ˜ : μ–‘μ˜ μ•½μˆ˜λ₯Ό λ‘κ°œ(1κ³Ό μžμ‹ )만 κ°€μ§€λŠ” μžμ—°μˆ˜

 

일반적으둜 효율적인 μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜

const arr = [];

for(let i=2;i<=10;i++) {
    let find = true;
    for(let j=2;j<=Math.sqrt(i);j++) {
        if(i%j == 0) {
            find = false;
            break;
        }
    }
    if(find) {
        arr.push(i);
    }
}

console.log(arr); // [2, 3, 5, 7]

 

κ°€μž₯ μƒκ°ν•˜κΈ° μ‰¬μš΄ N의 μ†Œμˆ˜ νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μ€ 2 ~ N-1κΉŒμ§€μ˜ 숫자 μ€‘μ—μ„œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ μ—†μ„λ•Œ μ†Œμˆ˜λΌκ³  νŒλ³„ ν•  수 μžˆμ§€λ§Œ, N의 μ•½μˆ˜λŠ” 무쑰건 √Nλ²”μœ„ μ•ˆμ— μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— √NκΉŒμ§€ ν™•μΈν–ˆμ„ λ•Œ O(√N)으둜 쑰금 효율적으둜 μ†Œμˆ˜λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 1개의 μˆ«μžμ— λŒ€ν•΄ μ†Œμˆ˜λ₯Ό ꡬ할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

 

μ—λΌν† μŠ€ν…Œμ²΄λ„€μŠ€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜

μ†Œμˆ˜λ₯Ό λŒ€λŸ‰μœΌλ‘œ λΉ λ₯΄κ³  μ •ν™•ν•˜κ²Œ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ—λΌν† μŠ€ν…Œμ²΄λ„€μŠ€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ νš¨μœ¨μ μž…λ‹ˆλ‹€.

 

const arr = [];
const check = Array(10+1).fill(true);
let m = Math.floor(Math.sqrt(10));

//i = 2 λΆ€ν„° i의 배수λ₯Ό λͺ¨λ‘ true둜 μ§€μ›λ‹ˆλ‹€.
//μ΄λ•Œ, 이미 μ§€μ›Œμ§„ μˆ«μžλŠ” continueν•©λ‹ˆλ‹€.
for(let i = 2; i <= m; i++){
    if(check[i]){
        arr.push(i);
        let temp = i+i;
        while(temp < check.length){
            check[temp] = false;
            temp += i;
        }
    }
}
for(let i = m+1; i < check.length; i++){
    if(check[i]) arr.push(i);
}

console.log(arr); // [2, 3, 5, 7]

 

μ—λΌν† μŠ€ν…Œμ²΄λ„€μŠ€μ˜ μ²΄λŠ” κ°€μž₯ λ¨Όμ € μ†Œμˆ˜λ₯Ό λ°˜λ³„ν•  λ²”μœ„λ§ŒνΌ 배열을 ν• λ‹Ήν•˜κ³  κ·Έ μΈλ±μŠ€μ— true값을 λ„£μ–΄μ€λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ, 2 ~ √N κΉŒμ§€ μžμ‹ μ„ μ œμ™Έν•œ 각 숫자의 λ°°μˆ˜λ“€μ˜ μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 배열값을 false둜 μ œμ™Έμ‹œν‚΅λ‹ˆλ‹€. μ΄λ•Œ, 각 숫자의 λ°°μˆ˜λ“€μ„ μ œμ™Έμ‹œν‚€ 전에 이미 false값이라면 ν•΄λ‹Ή 수의 λ°°μˆ˜λ“€μ€ 이미 μ œκ±°λμœΌλ―€λ‘œ κ±΄λ„ˆλœλ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, N이 10인 경우 Math.sqrt(10) = 3.1622776601683795 μ΄λ―€λ‘œ 2, 3, 4의 λ°°μˆ˜λ“€μ„ μ œμ™Έμ‹œν‚΅λ‹ˆλ‹€.

 

1) 2의 배수λ₯Ό 제거 

 

true (i=2) true false true false true false true false (i=10)

 

2) 3의 배수λ₯Ό 제거

 

true true false true false true false false false

 

 

λ”°λΌμ„œ, λ°°μ—΄μ—μ„œ true인 indexλ“€λ§Œ 뽑아낸닀면 2, 3, 5, 7 이 되고 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^(1/2))둜 계산이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

 

[μ°Έκ³ ]

https://blog.naver.com/PostView.naver?blogId=ndb796&logNo=221233595886&redirect=Dlog&widgetTypeCall=true&directAccess=false 

 

22. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ μ†Œμˆ˜(Prime Number) νŒλ³„ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. μ†Œμˆ˜λž€ 'μ–‘μ˜ μ•½μˆ˜λ₯Ό 두...

blog.naver.com