[IOS 로드맵] Combinations

willis18·2021년 10월 21일
0

IOS 로드맵

목록 보기
103/109

Combinations

조합 입니다.
n개의 요소에서 r개를 선택해서 나올 수 있는 조합의 수
예로 1,2,3 3개에서 2개를 선택해서 나올 조합은
1,2
1,3
2,3
이렇게 총 3개입니다

Combinations는 기본제공이 아니다

즉 직접 구현해야합니다 ㅠㅠ 아직 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]

0개의 댓글