HIT해

[Swift] 조합 본문

Swift/Swift 알고리즘

[Swift] 조합

힛해 2024. 11. 2. 00:24
728x90

 

중복없는 Target에서 원하는 만큼의 조합 구하기

var oper = ["+","-","x"]
    var oop = [[String]]()
    // 조합의 경우의 수
    
    func combi(_ targetArr : [String], _ arr:[String]) {
        if arr.count == 3 {
            oop.append(arr)
            return
        }
        for i in 0...2{
            if !arr.contains(oper[i]){
                combi(targetArr, arr + [targetArr[i]])
            }
        }
    }
    combi(oper,[])

 

targetArr과 시작할때 빈배열을 넣어 append가 아닌 잠시 합치는 방식으로 넘겨준다.

 

주의할 점은

combi(targetArr, arr + targetArr[i])

 

이걸로하면 배열과 배열의 합치기가 아닌 Array + String이 되기에 인자가 배열로서 들어가지 못하게 된다.

combi(targetArr, arr + [targetArr[i]])

 

이렇게 배열안에 넣어서 합친값을 넘겨주자.

 

중복있는 Target에서 원하는 만큼의 조합 구하기

중복이 있어도 되는 조합에서는 contains로 확인하는게 아닌 index를 건너뛰는 방식으로 해결해야한다.

인자로 현재 index + 1 값을 넘겨주고 해당 인덱스 부터 끝까지 반복문을 돌며 해결한다.

func combinationWithDuplicates(_ targetArr: [String], _ arr: [String], _ start: Int) {
    // 기저 조건: 현재 배열의 길이가 3이면 결과에 추가
    if arr.count == 3 {
        result.append(arr)
        return
    }
    
    // start 인덱스부터 시작하여 재귀적으로 조합 생성
    for i in start..<targetArr.count {
        combinationWithDuplicates(targetArr, arr + [targetArr[i]], i)  // 다음 반복에서도 현재 인덱스부터 시작
    }
}

let numbers = ["1", "2", "3"]
result = []  // 결과 배열 초기화
combinationWithDuplicates(numbers, [], 0)