코드는 Swift로 작성하였습니다.
제가 직접 작성한 코드라 최적의 코드가 아닐 수 있음을 알려드립니다. 🐹
문제는 저작권 관련 문제가 있을 수 있어서 적어두지 않았습니다.
1번을 구현하는 것이 가장 어려웠다 ...
끙끙거리다가 구글링을 조금 했다 😢 혼자 힘으로 전부 풀고 싶었는데...
이 문제에서 숫자들을 조합 할 때, 1장, 2장, ... 입력의 길이만큼의 장수를 뽑는 경우의 수가 있다.
1장은 기존 숫자 중 하나를 뽑으면 되고,
2장은 기존 숫자 중 하나를 뽑고 / 그 숫자를 뺀 나머지 배열에서 한장을 뽑아서 뒤에 붙히면 된다.
이런식으로 3장 4장 5장 ... 계속 뽑은 숫자를 뺀 배열에서 새로운 숫자를 뽑아 뒤에 붙여주면 된다!
그렇기 때문에 재귀를 사용한다.
func solution(_ numbers:String) -> Int {
let myArr: [String] = numbers.compactMap{String($0)}
let afterCombArr = Set(combination(numbers.count, myArr).compactMap{ return Int($0)}) // Int로 바꿔주면서 다시 Set을 적용시켜줘야함
var count = 0
for i in afterCombArr {
if prime(i) {
count += 1
}
}
return count
}
// 조합 함수
func combination(_ length: Int, _ array: [String]) -> Set<String> {
if length == 1 { return Set(array) }
var result = Set<String>()
for i in 0..<array.count {
let num = array[i]
var tempArray = array
tempArray.remove(at: i)
let afterComb = combination(length-1, tempArray)
let afterCombArr = afterComb.compactMap{num + $0}
result = result.union(afterComb)
result = result.union(afterCombArr)
}
return result
}
// 소수 구하는 함수
func prime(_ sosu: Int) -> Bool {
if sosu < 2 {
return false
}
for i in 2..<Int(sqrt(Double(sosu)))+1 {
if (sosu % i) == 0 {
return false
}
}
return true
}
옵셔널이 포함되어 있는 배열 -> nil을 제거하고 옵셔널 바인딩