조합 입니다.
n개의 요소에서 r개를 선택해서 나올 수 있는 조합의 수
예로 1,2,3 3개에서 2개를 선택해서 나올 조합은
1,2
1,3
2,3
이렇게 총 3개입니다
즉 직접 구현해야합니다 ㅠㅠ 아직 swift공식으로 기본제공되는 함수가 없답니다
//5개 중에 2개를 뽑는 모든 경우의 수
func combos<T>(elements: ArraySlice<T>, k: Int) -> [[T]] {
if k == 0 {
return [[]]
}
guard let first = elements.first else {
return []
}
let head = [first]
let subcombos = combos(elements: elements, k: k - 1)
var ret = subcombos.map { head + $0 }
ret += combos(elements: elements.dropFirst(), k: k)
return ret
}
func combos<T>(elements: Array<T>, k: Int) -> [[T]] {
return combos(elements: ArraySlice(elements), k: k)
}
let numbers = [1,2,3,4,5]
print(combos(elements:numbers,k:2))
/*
returns
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5],
[2, 2], [2, 3], [2, 4], [2, 5], [3, 3],
[3, 4], [3, 5], [4, 4], [4, 5], [5, 5]]
*/
// 모든 조합 구하기
func allCombos<T>(elements: Array<T>) -> [[T]] {
var answer: [[T]] = []
for i in 1...elements.count {
answer.append(contentsOf: combos(elements: elements, k: i))
}
return answer
}
let numbers = [1,2,3]
print(allCombos(elements: numbers))
// prints [[1], [2], [3], [1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]
위 방법으로 구현해서 사용했습니다.
출처 : https://velog.io/@hansangjin96/Swift-Factorial-Combination-Permutation
다만 이러한 작업을 또 라이브러리로 별도로 알고리즘을 구현해 놓은게 깃허브에 있더군용
https://github.com/apple/swift-algorithms
여기에 있는
https://github.com/apple/swift-algorithms/blob/main/Guides/Combinations.md
을 활용해서 쉽게 조합을 사용할 수 있습니다.
let numbers = [10, 20, 30, 40]
for combo in numbers.combinations(ofCount: 2) { // ofCount는 범위로도 지정가능 2..3 같이
print(combo)
}
// [10, 20]
// [10, 30]
// [10, 40]
// [20, 30]
// [20, 40]
// [30, 40]