import Foundation
func solution(_ begin:String, _ target:String, _ words:[String]) -> Int {
if !words.contains(target) {
return 0
}
var answer = 500
var visited = Set<String>()
func isClose(_ string1: String, _ string2: String) -> Bool {
let a = Array(string1), b = Array(string2)
let diffCount = (0..<string1.count).filter {a[$0] != b[$0] }.count
return diffCount == 1
}
func dfs(_ now: String, _ count: Int) {
visited.insert(now)
for next in words {
if isClose(now, next) && !visited.contains(next) {
if next == target {
answer = min(answer, count)
return
}
dfs(next, count + 1)
}
}
}
dfs(begin, 1)
return answer
}
- DFS를 사용해서 현재 단어와 한 글자만 다른 단어를 계속해서 탐색하고,
target
단어에 도달하면 탐색을 종료한다.
- 단어의 길이와 개수의 수가 작기 때문에 완전 탐색을 이용해서 한 글자만 다른 단어들을 찾아도 된다.
- 단어를 한 글자씩 쪼개서 탐색해야 할 줄 알고 고민했었는데.. 입력값의 크기가 작으면 완전 탐색을 사용해도 된다!! 까먹지 말자!!!