[프로그래머스] 불량 사용자 Swift

승아·2021년 4월 23일
0

프로그래머스 - 불량 사용자

나의 풀이

불량 사용자를 찾아 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
    }
}

0개의 댓글