재미있는 재귀함수, 패스워드를 재귀함수로 만들어보자!
⇢ 재귀
⇢ 정렬
⇢ 조합(순서가 정해져있기 때문에)
⇢ 패스워드의 최소 조건인 길이를 만족시켜서 생성
⇢ 패스워드가 모음 1개이상, 자음 2개이상을 포함하는지 확인 조건
⇢ 알파벳순으로 패스워드를 어떻게 생성할 것인지?
let input = readLine()!.split(separator: " ").map{Int($0)!}
let passwordArr = readLine()!
.split(separator: " ")
.map{String($0)}.sorted()
let l = input[0], c = input[1]
주어진 입력 형식에 맞게 데이터를 입력받는다.
(단, 제시된 조건인 "알파벳 순서대로"에 맞게, 입력된 알파벳을 정렬한다.)
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 활용을 위해, 위와 같이 구현해보았다.)
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)}