ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스][Kotlin]단어변환
    프로그래머스 2023. 2. 9. 16:15
    728x90
    class Solution {
        var changeCount : Int = 51
        fun solution(begin: String, target: String, words: Array<String>): Int {
            var answer = 0
            var visted = mutableMapOf<String,Boolean>()
            var vistedMap = mutableMapOf<String,MutableList<String>>() // 단어별 변환 될 수 있는 단어들
            if(!words.contains(target)) {
                return 0
            }
            var tempList = mutableListOf<String>()
            visted.put(begin,false)
            words.forEach{
                var count = 0
                for(i in 0 .. it.length-1){
                    if(begin[i] == it[i]) count++
                }
                if(count == it.length-1){
                    tempList.add(it)
                }
                visted.put(it,true)
            }
            vistedMap.put(begin,tempList)
    
            for(i in 0 .. words.size-1){
                var checkList = mutableListOf<String>()
                for(j in 0 .. words.size-1){
                    if(i == j){
                        continue
                    } else{
                        var count = 0
                        for(k in 0 .. words[i].length-1){
                            if(words[i][k] == words[j][k]) count++
                        }
                        if(count == words[i].length-1){
                            checkList.add(words[j])
                        }
                    }
                }
                vistedMap.put(words[i],checkList)
            }
    
            for(i in 0 until vistedMap[begin]!!.size){
                dfs(vistedMap[begin]!![i],visted,vistedMap,1,target)
            }
    
            return changeCount
        }
    
        fun dfs(begin: String, visted: MutableMap<String,Boolean>, 
                vistedMap: MutableMap<String,MutableList<String>>, 
                count: Int, target:String){
    
            var checkvisted = visted
            checkvisted.put(begin,false) // 방문표시
            if(begin == target){
                if(changeCount > count){
                    changeCount = count
                }
                return
            }
            var checkList = vistedMap.get(begin)
            if(checkList!!.isEmpty()) return
    
            for(i in 0 .. checkList.size-1){
                if(checkvisted[checkList[i]]!!){
                    dfs(checkList[i],checkvisted,vistedMap,count+1,target)
                    checkvisted[checkList[i]] = true
                }
            }
        }
    }

    확실히 DFS 알고리즘 문제들을 작성 할 수록 어떻게 작성하고 기초자료를 어떻게 만들어 놔야 계산하기 편하겠다라는것이 조금씩 보이기 시작하였습니다.

    작성하여 통과하고나서 보니 LV3 였다는것을 알게 되었습니다. 아무래도 특정 알고리즘때문에 LV가 올라간게 아닐까? 라는  생각이 들며 추가적으로 든 생각은 다른 DFS문제와 비슷하지만 words내 값별로 Boolean 값을 지정하여 계산한다는 점 이였던 것 같습니다.

    하지만 제가 풀던 방식에서 큰 차이는 못느꼈던것 같습니다.

    추후 다른 알고리즘을 알게 되거나 실력 향상이 되어 새롭게 작성할 수 있는 실력이 된다면 다시 작성할 수 있도록 하겠습니다.

Designed by Tistory.