[νλ‘κ·Έλλ¨Έμ€] (Swift) Kakao - νλ³΄ν€ (Lv.2)
π λ¬Έμ λ§ν¬
https://school.programmers.co.kr/learn/courses/30/lessons/42890
νλ‘κ·Έλλ¨Έμ€
μ½λ μ€μ¬μ κ°λ°μ μ±μ©. μ€ν κΈ°λ°μ ν¬μ§μ λ§€μΉ. νλ‘κ·Έλλ¨Έμ€μ κ°λ°μ λ§μΆ€ν νλ‘νμ λ±λ‘νκ³ , λμ κΈ°μ κΆν©μ΄ μ λ§λ κΈ°μ λ€μ λ§€μΉ λ°μΌμΈμ.
programmers.co.kr
π λμ νμ΄
ν보ν€κ° λ μ μλ μ‘°ν©μ μκ°ν΄μΌνλ€. κ·Έλμ combination ν¨μλ₯Ό μ¬μ©νλ€.
//nκ°μ€ mλ₯Ό μμμ μκ΄μμ΄ λ½μμΌν μ‘°ν©λ€μ λ§λ€μ΄μ£Όλ ν¨μ
func combination(n: [Int], m: Int, current index: Int, pickedArray: [Int]) {
if m == 0 {
cases.append(pickedArray)
}else if index == n.count {
return
}else {
var newSelected = pickedArray
newSelected.append(n[index])
combination(n: n, m: m-1, current: index+1, pickedArray: newSelected)
combination(n: n, m: m, current: index+1, pickedArray: pickedArray)
}
}
μ΄ ν¨μλ₯Ό μ¬μ©νλ©΄ μλμ κ°μ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
// μ¬μ©λ²
var temp = [1, 2, 3, 4, 5]
for i in 0..<temp.count {
combination(n: temp, m: i+1, current: 0, pickedArray: [])
}
print(cases)
μ΄λ κ² λͺ¨λ ν보ν€λ€μ μ‘°ν©μ μ»μ μ μλ€.
μ΄λ κ² κ΅¬νκ² λλ©΄, ν΄λΉ ν보ν€μ ν΄λΉνλ valueλ€μ λ£κ³ , valueλ€μ λͺ¨μμ κΈΈμ΄κ° relation κΈΈμ΄μ κ°λ€λ©΄ 쑰건μμ μ£Όμ΄μ§ 'μ μΌμ±'μ λ§μ‘±νλ κ²μ΄λ€. (μλ μ¬μ§)
μ΄μ 쑰건μμ μ£Όμ΄μ§, μ΅μμ±μ λ§μ‘±νλκ°λ₯Ό λ΄μΌνλλ°, μ΄λΆλΆμ΄ μ΄μ§ μ΄ν΄κ° κ°μ§ μμλ€. μ μ¬μ§ μμλ‘ λ³΄λ©΄ [νλ², μ΄λ¦] μ΄ μ΄λ―Έ ν보ν€μ λΆλΆμ§ν©μ ν΄λΉνλ€λ©΄, μ΅μμ±μ λ§μ‘±νμ§ λͺ»νλ κ²μΌλ‘ κ°μ£Όνλ€. (μλ μ€λͺ )
π μ λ΅ μ½λ
GitHub - deslog/Algorithm
Contribute to deslog/Algorithm development by creating an account on GitHub.
github.com
import Foundation
//μ‘°ν©λ€μ λ΄μ λ°°μ΄
var cases = [[Int]]()
func solution(_ relation:[[String]]) -> Int {
var candidateKey = [[Int]]()
var colsize = [Int]()
for i in 0..<relation[0].count {
colsize.append(i)
}
// 컬λΌμλ€μ μ‘°ν© μμ±
for i in 0..<colsize.count {
combination(n: colsize, m: i+1, current: 0, pickedArray: [])
}
// μ΅μμ± νμΈ isSuperset() λΆλΆμ§ν©μΈμ§ νμΈ
out: for c in cases {
//μ΅μμ±μ λ§μ‘±νλμ§ νμΈ
let set = Set(c)
//ν보ν€λ€μ νμ
for key in candidateKey {
//νλ³΄ν€ μμ νμ¬ keyκ° ν¬ν¨λκ² μλ€λ©΄ λμ΄κ°λ€.
if set.isSuperset(of: key) {
continue out
}
}
var rowSet = Set<Array<String>>()
// rowλ³λ‘ combiμ μλ μμ±λ€λ§ λ½μμ νμΈ
for row in relation {
var tuple = [String]()
for i in c {
tuple.append(row[i])
}
if !rowSet.contains(tuple) {
rowSet.insert(tuple)
} else {
break
}
}
if rowSet.count == relation.count {
candidateKey.append(c)
}
}
return candidateKey.count
}
//nκ°μ€ mλ₯Ό μμμ μκ΄μμ΄ λ½μμΌν μ‘°ν©λ€μ λ§λ€μ΄μ£Όλ ν¨μ
func combination(n: [Int], m: Int, current index: Int, pickedArray: [Int]) {
if m == 0 {
cases.append(pickedArray)
}else if index == n.count {
return
}else {
var newSelected = pickedArray
newSelected.append(n[index])
combination(n: n, m: m-1, current: index+1, pickedArray: newSelected)
combination(n: n, m: m, current: index+1, pickedArray: pickedArray)
}
}