👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/43136?language=kotlin
👊 도전
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. 설명
- BFS를 이용한다
- 최소를 묻고 있으므로 BFS를 한다.
- 이전에 체크했던 단어는 제외하기 위해 isVisited BooleanArray를 사용한다.
- poll한 값이 isVisited하지 않은 word들에서 하나만 다르다면 큐에 넣는다
- 변환 가능한지 체크하는 함수 isChangeWord를 두어 origin과 target이 Char 한 개만 다른 것인지 확인한다.
- 큐에서 뽑은 값(item)을 기준으로 words에서 방문하지 않은 것 중 변환이 가능하다면 큐에 넣는데, 이때 단계 카운트도 함께 갱신하여 넣어준다.