프로그래머스 - 가장 먼 노드(kotlin)

silver·2021년 8월 11일
0

[문제 내용]
1 노드로 부터 가장 멀리 떨어져 있는 노드들의 개수를 반환하라.
각 간선은 양방향이다.

[example 1]

nvertexreturn
6[[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]3

[해결 방법]
와..그 문제 해결은 빠르게 했는데,
그 시간초과 문제 때문에 엄청..갈아엎고 갈아엎고.. 해서.. 여기까지 왔다...어우..

일단 먼저 각 노드들을 key로 접근해서 연결된 노드들을 얻어올 수 있게
hashMap에 노드들을 정리한다.

이제 단계 단계 나아가기만 하면 되는데,
처음 1로 고정임으로 1부터 나아가면 된다.

example 1 에서를 가지고 얘기하면,
1 과 연결되 노드는 2,3이므로
그 다음 탐색할 노드는 2,3 이다.
그러고 2,3과 연결된 노드는 6,4,5 (먼저 방문한 곳은 제외)
이렇게 단계별로 탐색할 노드를 가져오면 된다.

1 다음 2,3이므로
2,3의 depth는 1이고
2,3 다음은 6,4,5이므로 depth는 2를 설정하면 된다.

class Solution {
    fun solution(n: Int, edge: Array<IntArray>): Int {
        var answer = 0

        var tree = HashMap<Int, MutableList<Int>>()

        for(e in edge) {
            var list = tree.getOrDefault(e[0], mutableListOf())
            list.add(e[1])
            tree.put(e[0], list)

            list = tree.getOrDefault(e[1], mutableListOf());
            list.add(e[0])
            tree.put(e[1], list)
        }

        val count = IntArray(n+1);
        findDepth(IntArray(1) {1}, tree, 1, BooleanArray(n+1) {false}, count)

        val max = count.max()
        answer = count.count { it == max }

        return answer
    }

    fun findDepth(starts: IntArray, tree: HashMap<Int, MutableList<Int>>, depth: Int, visited: BooleanArray, count: IntArray) {
        if(starts.isEmpty()) {
            return
        }

        val nexts = mutableListOf<Int>()
        for(start in starts) {
            visited[start] = true
            for(edge in tree.get(start)!!) {
                if(!visited[edge]) {
                    visited[edge] = true
                    nexts.add(edge)
                    count[edge] = depth
                }
            }
        }

        findDepth(nexts.toIntArray(), tree, depth + 1, visited, count)
    }
}

0개의 댓글