Swift Algorithm

소수 판별 알고리즘

Developer.Paul() 2021. 8. 19. 22:35
  • 기본 : 약수 성질 이용, 제곱근사용 -> Foundation 필요

import Foundation

func isPrime(_ num: Int) -> Bool {
    
    if num < 4 {
        return num == 1 ? false : true
    }
    
    for i in 2...Int(sqrt(Double(num))) {
        if num % i == 0 {
            return false
        }
    }
 
    return true
}

 

  • 에라토스테네스의 체 + 골드바흐 

import Foundation

let T = Int(readLine()!)!

// 에라토스테네스의 체, n이 4이상이라는 조건이 있어서 n < 4 예외처리를 제외
// 조건을 잘 확인하고 관련한 조건을 꼭 충족시켜줘야 한다.

func seiveEratos(_ n: Int, _ primes: inout [Bool]) {
    for i in 2...Int(sqrt(Double(n))) {
        for j in 2 ... n / i {
            primes[i*j] = false
        }
    }
}

for _ in 1...T {
    let n = Int(readLine()!)!
    var isPrimes = Array(repeating: true, count: n + 1)
    seiveEratos(n, &isPrimes)
    
    // 골드바흐의 추측
    
    for i in n/2...n {
        if isPrimes[i] {
            let rest = n - i
            if isPrimes[rest] {
                print("\(rest) \(i)")
                break
            }
        }
    }
    
}

 

소수 판별 알고리즘도 자주 출제되는 유형 중에 하나라고 한다. 이해 및 개념을 잡아두고 소수 관련한 문제에 사용해보자!