Swift/알고리즘
조합(Combination) 구현
papayetoo
2021. 10. 2. 20:22
이 글에서는 swift로 n개의 원소가 주어진 배열이 주어졌을 때 r개(0 < r <= n)의 결과를 구하는 코드를 구현해 보았습니다.
위 내용을 코드로 바꾸면 아래와 같습니다.
func uCombination<T>(elements: ArraySlice<T>, k: Int) -> [[T]] {
if k == 0 {
return [[]]
}
guard let first = elements.first else {
return []
}
let head = [first]
// n-1Cr-1
let includeFirst = uCombination(elements: elements.dropFirst(), k: k - 1)
// 첫 번째 원소는 반드시 포함한 조합의 결과
var ret = includeFirst.map { head + $0}
// 첫 번째 원소는 반드시 포함하지 않는 조합의 결과
// n-1Cr
var excludeFirst = uCombination(elements: elements.dropFirst(), k: k)
return ret + excludeFirst
}
/// Array 타입에 대해서도 조합을 구현하기 위한 함수
func uCombination<T>(elements: [T], k: Int) -> [[T]] {
return uCombination(elements: ArraySlice(elements), k: k)
}
이제 작성한 코드로 [1,2,3,4]로 주어진 배열에서 3개를 조합하는 코드를 작성하고 출력해 보겠습니다.
let arr = (1...4).map {$0}
let results = uCombination(elements: arr, k: 3)
results.forEach {print($0)}