프로그래머스

[프로그래머스][Kotlin] 여행 경로

끝까지 처음처럼 2023. 3. 15. 14:00
728x90

해당 문제는 dfs 와 map을 적절히 사용하여 풀 수 있습니다.

저의 경우 처음 코드 작성 시 도시 별 방문 할 수 있는 수를 map에 저장하여 작성하였었으나, 중복 티켓이 있을 경우 티켓의 수와 도시 별 방문 할 수 있는 수 이런 정보가 맞지 않아 테스트케이스 1번을 통과 하지 못하였었습니다.

그러다가 해당 문제의 힌트를 보고 티켓을 기준으로 map에 저장하여 체크를 한다면 정상적으로 모든 티켓을 사용하고 모든 도시를 방문하는 경우를 알 수 있겠구나 싶어 코드를 작성하였습니다.

그리고 해당 문제에 대한 코드를 작성하면서 문제에 따라 조금씩은 상이 하겠지만 data class를 이용하여 데이터의 정규화를 해놓고 비교하는 것이 추후 코드 디버깅을 할 때 문제를 조금 더 빨리 찾고 수정 할 수 있겠구나 라고 생각을 하였습니다.

 

하기는 제가 작성한 코드와 실행 결과 입니다.

class Solution {

    lateinit var visitcount : HashMap<Info,Int> // 해당 지점에 갈 수 있는 횟수
    lateinit var visitList : HashMap<String,ArrayList<String>> // 출발지점에서 갈 수 있는 도시
    var possibly = mutableListOf<Array<String>>()
    var count = 0

    data class Info(
        val start: String,
        val next: String
    )
    
    fun solution(tickets: Array<Array<String>>): Array<String> {
        visitcount = HashMap<Info,Int>() // 해당 지점에 갈 수 있는 횟수
        visitList = HashMap<String,ArrayList<String>>()

        
        for(ticket in tickets){
            if(visitcount.containsKey(Info(ticket[0],ticket[1]))){
                visitcount[Info(ticket[0],ticket[1])] = visitcount[Info(ticket[0],ticket[1])]!!+1
            } else {
                visitcount[Info(ticket[0],ticket[1])] = 1
            }

            if(visitList.containsKey(ticket[0])){
                visitList[ticket[0]]!!.add(ticket[1])
                visitList[ticket[0]]!!.distinct()
            } else {
                var temp = ArrayList<String>()
                temp.add(ticket[1])
                visitList[ticket[0]] = temp
            }
        }

        var temp = Array<String>(2,{""})
        temp[0] = "ICN"
        for(i in 0 .. visitList["ICN"]!!.size-1){
            temp[1] = visitList["ICN"]!![i]
            dfs(Info("ICN",visitList["ICN"]!![i]), temp)
        }

        possibly.sortWith(java.util.Comparator { o1, o2 -> o1.joinToString().compareTo(o2.joinToString()) })
        //println(possibly)

        return possibly.first()
    }

    fun dfs(now: Info,his:Array<String>){

        visitcount[now] = visitcount[now]!!-1

        if(visitcount.values.sum() == 0){
            possibly.add(his)
            visitcount[now] = visitcount[now]!!+1
            return
        }


        var temp = Array<String>(his.size+1,{""})
        if(!visitList[now.next].isNullOrEmpty()){
            for(i in 0 .. his.size-1){
                temp[i] = his[i]
            }
            for(i in 0 .. visitList[now.next]!!.size-1){
                if(visitcount[Info(now.next,visitList[now.next]!![i])]!! > 0){
                    temp[his.size] = visitList[now.next]!![i]
                    dfs(Info(now.next,visitList[now.next]!![i]),temp)
                }
            }
        }
        visitcount[now] = visitcount[now]!!+1
    }

}

실행 결과

테스트 1 통과 (1166.05ms, 392MB)
테스트 2 통과 (9.04ms, 60.5MB)
테스트 3 통과 (11.05ms, 62.2MB)
테스트 4 통과 (14.22ms, 61.4MB)