불량 사용자를 찾아 2차원 배열로 정리한 후 조합을 이용해 경우의 수를 구해주면 되는 문제. 중복을 제거하기 위해선 뽑은 아이디는 빼주고 다 뽑은 후 이전 값과 같은 배열이 있을 경우를 확인해주면 된다.
import Foundation
var result = 0
var answerID: [[String]] = []
func solution(_ user_id:[String], _ banned_id:[String]) -> Int {
var userSelect: [[String]] = []
// 1. 불량 사용자 찾기
for i in 0..<banned_id.count{
let bID = banned_id[i].map{ $0 }
var userArr: [String] = []
for j in 0..<user_id.count{
let uID = user_id[j].map{$0}
if bID.count == uID.count{
var correctCnt = 0
for k in 0..<bID.count{
if bID[k] == "*" || bID[k] == uID[k]{
correctCnt += 1
}else{
break
}
}
if correctCnt == bID.count{
userArr.append(user_id[j])
}
}
}
userSelect.append(userArr)
}
// 2. 조합으로 뽑기
combination(user_id, userSelect, 0, "", [])
return result
}
func combination(_ user_id: [String], _ userSelect: [[String]], _ i: Int, _ userID : String, _ k: [String]){
var userIDCopy = user_id
if userID == "" || userIDCopy.contains(userID){
// 뽑은 아이디는 빼주기
userIDCopy = userIDCopy.filter{ $0 != userID }
if i == userSelect.count{
var kArr = k
kArr.sort()
var c = 0
// 중복 제거
for x in 0..<answerID.count{
if answerID[x] == kArr{
break
}else{
c += 1
}
}
if c == answerID.count{
result += 1
answerID.append(kArr)
}
return
}else{
var kArr = k
for j in 0..<userSelect[i].count{
kArr.append(userSelect[i][j])
combination(userIDCopy, userSelect, i + 1, userSelect[i][j], kArr)
kArr.removeLast()
}
}
}else{
return
}
}