πŸ–₯ Computer Science/Algorithm

[Algorithm] μ†Œμˆ˜μ™€ κ΄€λ ¨λœ μ•Œκ³ λ¦¬μ¦˜(feat. μ—λΌν† μŠ€ ν…Œλ„€μŠ€μ˜ 체)

Fomagran πŸ’» 2022. 1. 19. 13:42
728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš” Foma πŸ’» μž…λ‹ˆλ‹€!

 

μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€λ‹€ 보면 μ†Œμˆ˜λ₯Ό 찾아햐 ν•˜λŠ” μœ ν˜•μ΄ λ§Žμ€λ°μš”.

 

μ†Œμˆ˜μ˜ 갯수λ₯Ό μ°Ύμ•„μ•Ό ν•  λ•Œ, μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ 뢄별해야 ν•  λ•Œ λ“± 효율적인 μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

 

μ˜€λŠ˜μ€ μ •ν™•νžˆ μ•Œκ³  λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•΄μ„œ 글을 정리해보렀고 ν•©λ‹ˆλ‹€.

 

λ°”λ‘œ μ‹œμž‘ν• κ²Œμš”~!


기쑴의 μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 방법

 

기쑴의 μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 방법은 kλΌλŠ” μˆ˜κ°€ μžˆλ‹€λ©΄ λ‹¨μˆœν•˜κ²Œ 2λΆ€ν„° nκΉŒμ§€ k둜 λ‚˜λˆ μ„œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 숫자의 갯수λ₯Ό νŒλ³„ν•˜λ©΄ 되겠죠?

 

ν•˜μ§€λ§Œ 이런 방법은 μˆ«μžκ°€ 컀지면 컀질수둝 λΉ„νš¨μœ¨μ μ΄κΈ° λ•Œλ¬Έμ— μ‹œκ°„μ΄ 였래 걸리게 λ©λ‹ˆλ‹€.

 

κ·ΈλŸ¬λ―€λ‘œ 효율적인 방법을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ°μš”.


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

 

λ¨Όμ € 2λΆ€ν„° nκΉŒμ§€μ˜ κ΅¬κ°„μ—μ„œ μ†Œμˆ˜μ˜ κ°―μˆ˜λ‚˜, μ–΄λ–€ μ†Œμˆ˜κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄μ„  "μ—λΌν† μŠ€ ν…Œλ„€μŠ€μ˜ 체"λ₯Ό μ•Œκ³ λ¦¬μ¦˜μ„ μ“°λ©΄ λ©λ‹ˆλ‹€.

 

μ°ΎλŠ” 방식은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

1. 2λΆ€ν„° nκΉŒμ§€ λͺ¨λ“  수λ₯Ό λ‚˜μ—΄ν•œλ‹€.

2. λ§Œμ•½ μ†Œμˆ˜λ₯Ό λ°œκ²¬ν–ˆλ‹€λ©΄ μ†Œμˆ˜λ₯Ό λ”°λ‘œ μ •ν•˜κ³  μ†Œμˆ˜μ˜ 배수λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€.

3. μœ„ 과정을 λ°˜λ³΅ν•˜λ©΄ κ΅¬κ°„μ˜ λͺ¨λ“  μ†Œμˆ˜κ°€ λ‚¨λŠ”λ‹€.

 

μ•„λž˜ 그림을 보면 μ΄ν•΄ν•˜κΈ° 훨씬 νŽΈν•˜μ‹€ κ±°μ—μš”!

 

좜처:μœ„ν‚€λ°±κ³Ό


 

μ½”λ“œ κ΅¬ν˜„

 

func countPrimeNumber(_ n: Int) -> Int {
    var count = 0
    var array = Array.init(repeating: false, count: n+1)
    
    for i in 2...n {
        if array[i] == false {
            count += 1
            
            for j in stride(from: i, through: n, by: i) {
               array[j] = true
            }
        }
    }
    return count
}

 

μ†Œμˆ˜λΆ„λ³„λ²•

 

κ·Έ λ‹€μŒμœΌλ‘œ μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ λΉ λ₯΄κ²Œ 확인해야 ν•  λ•ŒκΉŒ μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” "제곱근"을 μ΄μš©ν•˜λ©΄ λ˜λŠ”λ°μš”.

 

n의 μ•½μˆ˜λŠ” 무쑰건 n의 제곱근 μ•ˆμ— μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 2λΆ€ν„° sqrt(n)의 λ²”μœ„μ—μ„œ 자기 μžμ‹ μœΌλ‘œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό ν™•μΈν•˜λ©΄ λ©λ‹ˆλ‹€.

 

μ£Όμ˜ν•  점은 제곱근이 2보닀 크닀면 μ œκ³±κ·Όμ„ μ΄μš©ν•˜κ³  μ•„λ‹ˆλΌλ©΄ 2λΆ€ν„° nκΉŒμ§€ 탐색해야 ν•©λ‹ˆλ‹€.


μ½”λ“œ κ΅¬ν˜„

 

func isPrimeNumber(_ n:Int) -> Bool {
    let sqrt = Int(sqrt(Double(n))) >= 2 ? Int(sqrt(Double(n))) : n
    for i in 2..<sqrt {
        if n%i == 0 {
            return false
        }
    }
    return true
}
728x90
λ°˜μ‘ν˜•