알고리즘/프로그래머스

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

sm.jeon 2024. 1. 23. 19:26
반응형

사용 언어: Kotlin

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

출발지점과 도착지점이 담긴 ticket이 있다. ticket을 모두 소모하여 여행경로를 짰을 때, 공항 경로를 return한다.

두 가지 이상의 경로가 있을 때, 사전순으로 빠른 경로를 return한다.

제한사항

tickets = ticket이 담긴 배열

ticket[a,b] = a공항에서 b공항으로 이동하는 티켓

모든 도시를 방문할 수 없는 경우는 주어지지 않는다.

풀이

기본적인 DFS/BFS 문제이다. 출발지와 목적지가 같은 ticket이 있을 수 있다는 것, 동일한 목적지에 2번 이상 도착할 수 있나는 것을 고려해 풀이하면 된다.

ticket 자체를 visit 검사하고, ticket을 순회할 때, 출발지, 목적지가 같은 티켓이 사라지지 않도록 Set, Map을 사용하지 않는다.

코드

fun solution(tickets: Array<Array<String>>): Array<String> {
    val map = mutableMapOf<String, ArrayList<String>>()
    val visitedMap = mutableMapOf<String, ArrayList<Boolean>>()
    tickets.forEach {
        if (map[it[0]] == null) {
            map[it[0]] = arrayListOf()
            visitedMap[it[0]] = arrayListOf()
        }
        map[it[0]]?.add(it[1])
        visitedMap[it[0]]?.add(false)
    }
    map.forEach {
        it.value.sort()
    }
    return dfs(map, visitedMap, "ICN", 0, tickets.size).toTypedArray().reversedArray()
}

fun dfs(map: Map<String, List<String>>, visitedMap: Map<String, ArrayList<Boolean>>, start: String, depth: Int, ticketSize: Int): ArrayList<String> {
    val tickets = map.getOrDefault(start, arrayListOf())
    val visitedList = visitedMap.getOrDefault(start, arrayListOf())

    if(depth == ticketSize) {
        return arrayListOf(start)
    }

    for(i in tickets.indices) {
        if(!visitedList[i]) {
            visitedList[i] = true
            val result = dfs(map, visitedMap, tickets[i], depth + 1, ticketSize)
            if (result.size != 0) {
                result.add(start)
                return result
            }
            visitedList[i] = false
        }
    }
    return arrayListOf()
}
반응형