๐ ๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/42890
๐ ๋์ ํ์ด
ํ๋ณดํค๊ฐ ๋ ์ ์๋ ์กฐํฉ์ ์๊ฐํด์ผํ๋ค. ๊ทธ๋์ 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 ๊ธธ์ด์ ๊ฐ๋ค๋ฉด ์กฐ๊ฑด์์ ์ฃผ์ด์ง '์ ์ผ์ฑ'์ ๋ง์กฑํ๋ ๊ฒ์ด๋ค. (์๋ ์ฌ์ง)
์ด์ ์กฐ๊ฑด์์ ์ฃผ์ด์ง, ์ต์์ฑ์ ๋ง์กฑํ๋๊ฐ๋ฅผ ๋ด์ผํ๋๋ฐ, ์ด๋ถ๋ถ์ด ์ด์ง ์ดํด๊ฐ ๊ฐ์ง ์์๋ค. ์ ์ฌ์ง ์์๋ก ๋ณด๋ฉด [ํ๋ฒ, ์ด๋ฆ] ์ด ์ด๋ฏธ ํ๋ณดํค์ ๋ถ๋ถ์งํฉ์ ํด๋นํ๋ค๋ฉด, ์ต์์ฑ์ ๋ง์กฑํ์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. (์๋ ์ค๋ช )
๐ ์ ๋ต ์ฝ๋
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)
}
}