[swift] 소수 찾기

ohtt-iOS·2020년 12월 17일
0

프로그래머스

목록 보기
5/9
post-thumbnail

코드는 Swift로 작성하였습니다.
제가 직접 작성한 코드라 최적의 코드가 아닐 수 있음을 알려드립니다. 🐹


문제는 저작권 관련 문제가 있을 수 있어서 적어두지 않았습니다.



✍🏻 생각정리

  1. 나올 수 있는 모든 조합을 구한다.
  2. set에 넣는다
  3. 넣은 것들을 Int형으로 변환한다.
  4. 소수인지 확인한다.

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
}


compactMap

옵셔널이 포함되어 있는 배열 -> nil을 제거하고 옵셔널 바인딩

profile
오뜨 삽질 🔨 블로그

0개의 댓글