플랫폼 | 번호 | 제목 | 유형 | 난이도 | 언어 |
---|---|---|---|---|---|
프로그래머스 | 42839 | 소수 찾기 | 완전탐색 | Lv.2 | Swift |
숫자 종이 개수가 최대 7로 경우의 수가 많지 않아 완전탐색으로 진행했다.
DFS로 숫자 종이로 만들 수 있는 숫자의 모든 경우를 탐색했다. 탐색하면서 해당 숫자가 소수인지를 확인하여 result
Set 자료형(중복이 있기 때문)에 담았다.
소수를 판별하는 함수를 직접 구현해야 한다. 가장 기본적인 방법으로 구현했다. (O(N)
)
결국 result에 담긴 요소의 개수가 답이 된다.
import Foundation
func solution(_ numbers:String) -> Int {
let nums = numbers.map{ String($0) }
func isPrimeNum(_ n: [String]) -> Bool {
guard let num = Int(n.joined()) else { return false }
if num <= 1 { return false }
if num <= 3 { return true }
if num % 2 == 0 { return false }
for i in 2..<sqrt(num) {
if num % i == 0 { return false }
}
return true
}
var result: Set<Int> = []
var visited = Array(repeating: false, count: nums.count)
func dfs(_ nnum: [String]) {
for (i, num) in nums.enumerated() {
if nnum.isEmpty && num == "0" { continue }
var newNum = nnum + [num]
if !visited[i] {
visited[i] = true
if isPrimeNum(newNum) {
result.insert(Int(newNum.joined())!)
}
dfs(newNum)
visited[i] = false
}
}
}
dfs([])
return result.count
}
이번에는 가장 기본적인 소수 판별 알고리즘을 사용했다. 하지만 O(N)으로 판발하려는 숫자가 클수록 비효율적이다.
그래서 에라토스테네스의 체와 같은 알고리즘이 존재한다. 시간초과를 대비하여 학습해 두자.