Algorithm/문제풀이_백준
[Swift][DFS] 백준 1759번 (암호만들기)
Joahnee
2021. 10. 1. 15:56
요구능력 : DFS와 백트래킹에 대한 이해
코드설명 :
N과M(8) 문제로 선행학습을 하고 풀면 정말 효율적일거같다. 안푸셨다면 풀고오시길...
N과M(8)에서 바뀐부분
1. 숫자가 아닌 알파벳이라는 점
2. for문을 이용하여 자음이 2개이상, 모음이 1개이상인지 판별
후기 : 우연찮게 이 문제를 접하게됬는데 N과M(8)과 거의 유사한문제다.. 자음 2개이상과 모음1개이상이 들어갔는지만 판별하면 되는 문제였다.. 골드문제를 처음으로 15분도안걸려서 풀었다. 시간초과가 날거같았는데, 2초인거보고 안심...
let LC = readLine()!.split(separator: " ").map{Int(String($0))!}
let L = LC[0]
let C = LC[1]
let arr = readLine()!.split(separator: " ").map{String($0)}.sorted()
let vowel = ["a","e","i","o","u"]
let consonant = ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]
var depth = 0
var visited: [Bool] = Array(repeating: false, count: C)
var result: [String] = []
func dfs(_ depth: Int, _ start: Int){
if depth == L{
var isprinted = false
for i in vowel{
if result.contains(i){
isprinted = true
}
}
var count = 0
for j in consonant{
if result.contains(j){
count += 1
}
}
if count >= 2 && isprinted{
print(result.joined(separator: ""))
}
return
}
for i in start..<C{
if !visited[i] {
visited[i] = true
result.append(arr[i])
dfs(depth + 1, i)
visited[i] = false
result.removeLast()
}
}
}
dfs(depth, 0)