본문 바로가기
Algorithm/Programmers

[고득점 Kit (완전 탐색)] 소수 찾기 (swift)

by 원만사 2021. 10. 11.
반응형

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr

 

 

풀이


 

먼저 입력 받은 numbers 문자열을 Int형 배열로 만들어준다.

let intArray: [Int] = numbers.map { Int(String($0)) ?? 0 }

 

순열을 이용해서 만들어 낼 수 있는 모든 숫자 조합을 찾은 후에 각각의 숫자를 소수인지 판별하여 셋에 저장한 후에 마지막에 셋에 있는 숫자의 개수를 카운트한다.

 

코드


import Foundation

var res: Set<Int> = []

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

func permute(_ nums: [Int], _ targetNum: Int) {
    var visited: [Bool] = [Bool](repeating: false, count: nums.count)
    
    func permutation(_ permuRes: [Int]) {
        if permuRes.count == targetNum {
            
            // Int 배열을 String으로 변환 후 Int로 변환해서 소수 판별
            let strRes = permuRes.map(String.init).joined()
            
            if let intRes = Int(strRes) {
                if isPrime(intRes) {
                    res.insert(intRes)
                }
            }
            
            return
        }
        
        for i in 0..<nums.count {
            if visited[i] {
                continue
            }
            
            visited[i] = true
            permutation(permuRes + [nums[i]])
            visited[i] = false
        }
    }
    
    permutation([])
}

func solution(_ numbers:String) -> Int {
    let intArray: [Int] = numbers.map { Int(String($0)) ?? 0 }
    
    for i in 1...numbers.count {
        permute(intArray, i)
    }
    
    return res.count
}

 

 

반응형

댓글