백준 - 신기한 소수 (2023)

240-coding·2023년 1월 25일
0

알고리즘

목록 보기
21/36
post-thumbnail
import Foundation

let N = Int(readLine()!)!
var answer = ""

dfs(2, 1)
dfs(3, 1)
dfs(5, 1)
dfs(7, 1)

print(answer)

func dfs(_ number: Int, _ digit: Int) {
    if digit == N {
        if isPrime(Double(number)) {
            answer += "\(number)\n"
            return
        }
    }
    for i in stride(from: 1, to: 10, by: 2) {
        let nextNumber = number * 10 + i
        if isPrime(Double(nextNumber)) {
            dfs(nextNumber, digit + 1)
        }
    }
}

func isPrime(_ number: Double) -> Bool {
    if [2, 3, 5, 7].contains(number) { return true }
    
    let end = Int(number.squareRoot()) + 1
    return (2...end).filter{ Int(number) % $0 == 0 }.isEmpty
}
  • DFS의 형태로 자릿수를 하나씩 더해가며 소수인지 여부를 검사한다.
    • 처음에는 2, 3, 5, 7, 중간부터는 홀수만을 탐색하기 때문에 시간 복잡도를 줄일 수 있다.
  • 소수 판별을 위해 filter 메소드를 썼더니 한 자리 수(2, 3, 5, 7)은 제대로 판별이 되지 않는다. 그래서 꾸역꾸역 한 자리 수는 따로 검사하는 코드를 추가했다.
profile
나의 내일은 파래 🐳

0개의 댓글