[Kotlin/프로그래머스] 코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS) > 단어 변환

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/43136?language=kotlin

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*
class Solution {
    fun solution(begin: String, target: String, words: Array<String>): Int {
/*
1. 최소니까 bfs
2. isVisited를 두고 중복 방지
3. 큐에서 뽑은 item이 target이면 return
4. item에서 하나만 바꿔서 갈 수 있는 거를 visited하고 큐에 삽입
*/
        var answer = 0
        val queue: Queue<Pair<String, Int>> = LinkedList()
        val isVisited = Array<Boolean>(words.size) { false }
        queue.offer(begin to 0)
        while (queue.isNotEmpty()) {
            val item = queue.poll()
            if (item.first == target) {
                answer = item.second
                break
            }
            for (i in words.indices) {
                if (!isVisited[i] && isChangeWord(item.first, words[i])) {
                    isVisited[i] = true
                    queue.offer(words[i] to item.second + 1)
                }
            }
        }
        return answer
    }
    
    fun isChangeWord(origin: String, target: String): Boolean {
        var isDiff = 0
        for (i in origin.indices) {
            if (origin[i] != target[i]) isDiff++
        }
        return isDiff == 1
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. BFS를 이용한다
    • 최소를 묻고 있으므로 BFS를 한다.
    • 이전에 체크했던 단어는 제외하기 위해 isVisited BooleanArray를 사용한다.
  2. poll한 값이 isVisited하지 않은 word들에서 하나만 다르다면 큐에 넣는다
    • 변환 가능한지 체크하는 함수 isChangeWord를 두어 origin과 target이 Char 한 개만 다른 것인지 확인한다.
    • 큐에서 뽑은 값(item)을 기준으로 words에서 방문하지 않은 것 중 변환이 가능하다면 큐에 넣는데, 이때 단계 카운트도 함께 갱신하여 넣어준다.

👏 해결 완료!