👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[프로그래머스] 소수 만들기

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/12977?language=swift 

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

 

 

https://leechamin.tistory.com/453?category=941567 

 

[프로그래머스] 소수 찾기

https://programmers.co.kr/learn/courses/30/lessons/42839?language=swift 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지..

leechamin.tistory.com

 

소수 찾기와 동일한 문제. 

 

에라토스테네스의 체와 조합을 활용하여 풀이하였다. 

 

바로 코드로! 

 

import Foundation

func solution(_ nums:[Int]) -> Int {
    var count = 0
    for n in combinations(nums,3).map {$0.reduce(0,+)} {
        if isPrime(n) {
            count += 1
        }
    }
    return count
}

// 에라토스테네스의 체
func isPrime(_ num: Int) -> Bool {
    var state = true
    for i in 2..<num {
        if num % i == 0 {
            state = false
            break
        }
    }
    return state
}

func combinations<T>(_ elements: [T], _ k: Int) -> [[T]] {
    // 배열과 추출 개수가 같을 경우 > 그대로 반환
    if elements.count == k {
        return [elements]
    }
    // 추출 개수가 0인 경우 > 빈 배열 반환
    if k == 0 {
        return []
    }
    // 추출 개수가 1인 경우 > 배열의 각 원소들 반환
    if k == 1 {
        return elements.map {[$0]}
    }
    
    // 결과를 저장할 2차원 배열을 생성한다. 
    var result = [[T]]()
    // 원배열의 첫 원소를 제외한 나머지 배열을 저장한다.
    let rest = Array(elements.suffix(from:1))
    // 나머지 배열들을 이용해서 재귀적으로 조합을 구한다. 
    let subcombos = combinations(rest,k-1)
    // 첫 원소 + 나머지 배열들의 재귀적 조합 결과를 하나씩 붙여서 결과에 더한다.
    result += subcombos.map { [elements[0]] + $0 }
    // 첫 원소와 무관하게 나머지 배열들로만 다시 조합을 구해 결과에 더한다. 
    result += combinations(rest,k)
    
    return result
}

 

 

728x90
반응형