Swift - μˆœμ—΄κ³Ό μ‘°ν•© κ΅¬ν˜„ν•˜κΈ°

2022. 9. 29. 15:12ㆍios

Swift - μˆœμ—΄κ³Ό μ‘°ν•© κ΅¬ν˜„ν•˜κΈ°

 

 

 μˆœμ—΄κ³Ό 쑰합을 μ™œ 직접 κ΅¬ν˜„ν•˜λ‚˜μš”..?

 

μŠ€μœ„ν”„νŠΈμ—λŠ” μˆœμ—΄κ³Ό 쑰합을 라이브러리 ν˜•νƒœλ‘œ μ œκ³΅ν•˜λŠ” 것이 μ—†λ‹€. 

λ•Œλ¬Έμ— μ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œ μ‚¬μš©ν•  λ•Œ 직접 κ΅¬ν˜„ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€...γ…Ž

 

전체적인 λ§₯락을 μ΄ν•΄ν•˜λ©΄ 쉽기 λ•Œλ¬Έμ— μ •λ¦¬ν•΄μ„œ ν•„μš”ν• λ•Œλ§ˆλ‹€ μ‚¬μš©ν•˜κ³ μž μ •λ¦¬ν•œλ‹€

 

 μˆœμ—΄

 

μˆœμ—΄μ€ μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œμ—μ„œ r개λ₯Ό 쀑볡없이 μˆœμ„œμ— μƒκ΄€μžˆκ²Œ μ„ νƒν•˜λŠ” ν˜Ήμ€ λ‚˜μ—΄ν•˜λŠ” 것을 μˆœμ—΄μ΄λΌκ³  ν•œλ‹€. 

핡심은 μˆœμ„œκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— [1, 2, 3, 4]μ—μ„œ [1, 2]와 [2, 1]을 κ΅¬λΆ„ν•΄μ„œ μΉ΄μš΄νŠΈν•˜λŠ” 것이 핡심이닀.

 

func permutation(_ target: [String], _ targetNum: Int) {
	// μˆœμ—΄μ΄ λ˜λŠ” 수의 쑰합을 λ‹΄λŠ” κ³³
    var results: [[String]] = []
    // ν˜„μž¬ νƒμƒ‰ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ°°μ—΄
    var check = [Bool](repeating: false, count: target.count)
    
    func permute(_ arr: [String]) {
    	// μˆœμ—΄μ˜ κ°œμˆ˜κ°€ λ½‘μœΌλ €λŠ” μˆ«μžμ™€ 같을 λ•Œ μ’…λ£Œ
        if arr.count == targetNum {
            results.append(arr)
            return 
        }
        for i in 0..<target.count {
        	// ν˜„μž¬ νƒμƒ‰ν•˜λŠ” μΈλ±μŠ€κ°€ 배열에 λ‹΄κ²¨μžˆλ‹€λ©΄ λ„˜μ–΄κ°„λ‹€.
            if check[i] == true {
                continue
            } else {
                check[i] = true
                permute(arr + [target[i]])
                check[i] = false
            }
        }
    }
    permute([])
}

μž¬κ·€λ₯Ό μ΄μš©ν•˜λ‹ˆ κΌ­ DFS와 λΉ„μŠ·ν•΄ 보인닀..

 

 μ‘°ν•©

 

쑰합은 μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œμ—μ„œ r개λ₯Ό 쀑볡없이 μˆœμ„œμ— 상관없이 μ„ νƒν•˜λŠ” ν˜Ήμ€ λ‚˜μ—΄ν•˜λŠ” 것을 쑰합이라고 ν•œλ‹€.

핡심은 μˆœμ„œμ™€ 상관이 μ—†κΈ° λ•Œλ¬Έμ— check배열을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ•žμœΌλ‘œλ§Œ νƒμƒ‰ν•˜λŠ” 것이닀. 

 

인덱슀 0λΆ€ν„° νƒμƒ‰ν•œλ‹€λ©΄ μΈλ±μŠ€κ°€ 1μΌλ•Œ 0μΌλ•Œμ˜ 값을 λ„£κ³  1λΆ€ν„° λ‹€μ‹œ for문을 λ„λŠ” ν˜•μ‹μ΄λ‹€.

μ˜ˆμ‹œλ‘œ [1, 2, 3, 4]κ°€ μžˆμ„ λ•Œ μˆœμ—΄μ˜ κ²½μš°λŠ” [1, 2], [1, 3], [1, 4]λ₯Ό 돌고 [2, 1]을 돌게 λ˜λŠ”λ° μ΄λŠ” indexλ₯Ό μ•žμ—μ„œλΆ€ν„° 또 돌기 λ•Œλ¬Έμ΄λ‹€. 쑰합은 [1, 2], [1, 3], [1, 4]μ—μ„œ [2, 1]이 μ•„λ‹Œ [2, 3]으둜 κ°€μ•Ό 관계없이 경우의 수λ₯Ό 카운트 ν•  수 μžˆλ‹€.

 

Intλ‚˜ String에 μ œν•œλ˜μ§€ μ•Šμ€ λ²”μš©μ μΈ 것을 λ‹΄κΈ° μœ„ν•΄ Tλ₯Ό μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„ν–ˆλ‹€! (λ‹€λ₯Έ λΆ„μ˜ μ½”λ“œλ₯Ό μ°Έκ³ )

 

func combination<T: Comparable>(_ targetArr: [T], _ n: Int) -> [[T]] {
    var results = [[T]]()
    if targetArr.count < n { return results }
    
    func cycle(_ idx: Int, _ arr: [T]) {
        if arr.count == n {
            results.append(arr)
            return
        }
        for i in idx..<targetArr.count {
            cycle(i + 1, arr + [targetArr[i]])
        }
    }
    cycle(0, [])
    
    return results
}

 

'ios' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Swift - components, split  (1) 2022.09.30
Swift - zip  (0) 2022.09.30
Swift - Set 톺아보기  (0) 2022.09.28
Swift - 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜κΈ°  (0) 2022.09.27
Swift - μ•„μŠ€ν‚€μ½”λ“œ λ³€ν™˜ν•˜κΈ°  (0) 2022.09.27