강의로 돌아가기
Choi Youjun

테스트케이스 3 해결방법 하나(Kotlin)

저는 DFS를 이용해 풀었습니다.

  • 1. word에 target이 없을 경우 0을 리턴
  • 2-1. word에 target이 있을 경우 DFS 탐색 시작
  • 2-2. begin에서 target으로 가는 모든 방법을 찾아 카운트하여 list에 add함
  • 3. DFS탐색 종료 후, list를 확인
  • 3-1. list가 비어 있는 경우(target이 word에 존재하지만, word내에서 target으로 가는 방법이 없을 경우) 0 리턴
  • 3-2. list가 비어 있지 않는 경우, list.min()으로 list의 최솟값을 반환

이러한 로직으로 풀이했을 때, 테스트케이스3가 틀렸는데
isConvertable함수에서 "현재 String"에서 "이동할 String"으로 이동할 수 있는지 판별하는 방식이 잘못돼서 문제가 발생했습니다.

기존에 했던 방식은 "현재 String"의 각 글자를 "이동할 String"이 포함하고 있는지 확인하는 방식으로 진행했는데,
이럴 경우 "hht" -> "hih"로 가는 경우가 생깁니다.
(문제의 조건에서 한 글자만 변경하여 이동가능하다 했지만, 이 경우는 2글자가 변경되었는데도 이동함)
이런 접근 방식에서 "현재 String"과 "이동할 String"의 같은 index 글자를 비교 하는 방식으로 해결했습니다.

작성중인 코드―solution.kt
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//import java.util.Stack

class Solution {
    var check: BooleanArray = booleanArrayOf()
    val list: MutableList<Int> = mutableListOf()
    // var stack: Stack<String> = Stack()

    fun solution(begin: String, target: String, word: Array<String>): Int {
        return if (word.contains(target)) {
            for (i in word.indices) {
                check = BooleanArray(word.size) { false }
                if (isConvertable(begin, word[i])) {
                    check[i] = true
    //                stack.push(begin); stack.push(word[i])
                    dfs(word[i], target, word, 1)
    //                stack.pop(); stack.pop()
                }
            }
            if (list.isEmpty()) 0
            else {
                list.forEach { println(it) }
                list.min()!!
            }
        }
        else 0
    }

    fun dfs(begin: String, target: String, word: Array<String>, count: Int) {
        if (begin == target) {
            list.add(count)
    //        println(stack.joinToString(" -> ", "", "(${count})"))
            return
        }

        for (i in word.indices) {
            if (check[i]) continue
            if (isConvertable(begin, word[i])) {
                check[i] = true
    //            stack.push(word[i])
                dfs(word[i], target, word, count + 1)
    //            stack.pop()
                check[i] = false
            }
        }
    }

    // fun isConvertable(begin: String, target: String): Boolean = begin.filter { target.contains(it) }.count() == begin.length - 1
    // begin의 각 Character를 target이 가지고 있는지 파악하여 변환 가능한 글자를 찾아내려 했지만
    // 이렇게 탐색을 할 경우 hht(begin)-> hih(target)가 가능하여 문제가 있음
    // i는 index라고 했을 때, begin[i] == target[i]로 탐색을 해야 올바른 방법

    fun isConvertable(begin: String, target: String): Boolean = BooleanArray(begin.length) { begin[it] == target[it] }.count { it } == begin.length - 1

}
  • 신철호

    덕분에 테케3 통과했습니다. 감사합니다.

    신철호―2020.09.01 09:18
  • ckdehd200

    저도 똑같은 실수를 했네요ㅎㅎ 덕분에 통과했습니다 감사합니다!

    ckdehd200―2020.09.05 13:38
  • 정민소

    저도 덕분에 해결했습니다 ㅎㅎ 감사합니다.

    정민소―2021.01.02 00:15
  • 신현아

    와... 감사합니다ㅠㅠㅠ

    신현아―2021.11.11 20:17
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.