문제
시작 단어와 완성단어가 주어지고 시작단어를 최소한으로 변환시켜 완성단어까지 바꾸는 문제이다.
단 단어의 변환시 한 글자만 다른 단어로 변환할 수 있다.
풀이
먼저 단어를 변환시키는 방법으로 DFS를 사용하였다.
또한 단어의 한글자만 다른 것을 검사하는 check 함수를 구현하였다.
먼저 Check함수이다.
fun check(a: String, b: String): Boolean {
var cnt = 0
for (i in 0 until a.length) {
if (a[i] != b[i]) cnt++
}
if (cnt == 1) return true
else return false
}
두 단어를 불러와서 검사한 뒤 한글자만 다를경우 True를 반환한다.
fun DFS(start: String, depth: Int) {
if (start == target) {
answer = min(answer, depth)
return
}
for (i in words.indices) {
if (!visited[i] && check(start, words[i])) {
visited[i] = true
DFS(words[i], depth + 1)
visited[i] = false
}
}
}
DFS는 다음과 같다.
단어가 마지막 단어와 일치할경우 현재 answer를 갱신해준다.
아닐경우 단어목록을 불러와서 방문하지 않고 check함수를 통과했을경우 다음 depth로 넘겨준다.
answer의 갱신을 할 때 현재 depth와 비교하여 작은값으로 갱신하므로 가장 짧은 변환을 찾을 수 있다.
코드
import kotlin.math.*
class Solution {
fun solution(begin: String, target: String, words: Array<String>): Int {
var answer = Int.MAX_VALUE
val visited = MutableList(words.size){ false }
fun DFS(start: String, depth: Int) {
if (start == target) {
answer = min(answer, depth)
return
}
for (i in words.indices) {
if (!visited[i] && check(start, words[i])) {
visited[i] = true
DFS(words[i], depth + 1)
visited[i] = false
}
}
}
DFS(begin, 0)
if (answer == Int.MAX_VALUE) answer = 0
return answer
}
fun check(a: String, b: String): Boolean {
var cnt = 0
for (i in 0 until a.length) {
if (a[i] != b[i]) cnt++
}
if (cnt == 1) return true
else return false
}
}
'알고리즘' 카테고리의 다른 글
[백준 kotlin] 17609 회문 (0) | 2024.05.25 |
---|---|
[프로그래머스 kotlin] 보석 쇼핑 (0) | 2024.05.19 |
[백준 kotlin] 19845 넴모넴모2020 (0) | 2024.05.15 |
[프로그래머스 kotlin] 네트워크 (0) | 2024.05.13 |
[kotlin 알고리즘] 정N각형의 삼각 분 (0) | 2024.05.11 |