[swift] 암호 만들기

hooon·2022년 8월 13일
1

[Swift 알고리즘]

목록 보기
8/8

📌 백준 Gold 5

재미있는 재귀함수, 패스워드를 재귀함수로 만들어보자!

📝 KeyWord

⇢ 재귀
⇢ 정렬
⇢ 조합(순서가 정해져있기 때문에)

📌 문제풀이


⇢ 패스워드의 최소 조건인 길이를 만족시켜서 생성
⇢ 패스워드가 모음 1개이상, 자음 2개이상을 포함하는지 확인 조건
⇢ 알파벳순으로 패스워드를 어떻게 생성할 것인지?

#1

let input = readLine()!.split(separator: " ").map{Int($0)!}
let passwordArr = readLine()!
   .split(separator: " ")
   .map{String($0)}.sorted()
let l = input[0], c = input[1]

주어진 입력 형식에 맞게 데이터를 입력받는다.
(단, 제시된 조건인 "알파벳 순서대로"에 맞게, 입력된 알파벳을 정렬한다.)

#2

extension String{
    var isCorrect: Bool{
        var num = 0
        let vowelArr = ["a" , "i", "e", "o", "u"]
        self.forEach { if vowelArr.contains(String($0)) { num += 1 } }
        if num >= 1 && self.count - num >= 2 { return true }
        else { return false}
    }
}

주어진 조건, 모음 1개 이상, 자음 2개 이상 포함하는지 확인 조건을 구현.
(extension 활용을 위해, 위와 같이 구현해보았다.)

#3


func dfs(_ passwordArr:[String], _ passwordLength: Int) -> [String]{
    var answer: [String] = []
    func cycle(_ depth: Int, _ password: String, _ idx: Int){
        if depth == passwordLength && password.isCorrect {
            answer.append(password)
        } else{
            for i in idx..<passwordArr.count
            {
                cycle(depth + 1, password + passwordArr[i], i + 1)
            }
        }
    }
    cycle(0,"", 0)
    return answer
}

(1) 이제 단순히, dfs를 통해 주어진 알파벳 배열을 제시된 길이만큼 패스워드를 생성.
(2) 생성된 패스워드가 구현조건을 만족한다면, answer 배열에 추가.

📝 전체코드


extension String{
    var isCorrect: Bool{
        var num = 0
        let vowelArr = ["a" , "i", "e", "o", "u"]
        self.forEach { if vowelArr.contains(String($0)) { num += 1 } }
        if num >= 1 && self.count - num >= 2 { return true }
        else { return false}
    }
}


func dfs(_ passwordArr:[String], _ passwordLength: Int) -> [String]{
    var answer: [String] = []
    func cycle(_ depth: Int, _ password: String, _ idx: Int){
        if depth == passwordLength && password.isCorrect {
            answer.append(password)
        } else{
            for i in idx..<passwordArr.count
            {
                cycle(depth + 1, password + passwordArr[i], i + 1)
            }
        }
    }
    cycle(0,"", 0)
    return answer
}


let input = readLine()!.split(separator: " ").map{Int($0)!}
let passwordArr = readLine()!
	.split(separator: " ")
	.map{String($0)}.sorted()
let l = input[0], c = input[1]

dfs(passwordArr, l).forEach { print($0)}

0개의 댓글