[문제 내용]
1 노드로 부터 가장 멀리 떨어져 있는 노드들의 개수를 반환하라.
각 간선은 양방향이다.
[example 1]
n | vertex | return |
---|---|---|
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)
}
}