풀이
- 해당 문제는 그래프와 그래프 탐색 알고리즘 개념만 알면 상당히 쉬운 문제이다.
- 필자의 풀이는 인접 리스트를 만들어 각 노드가 연결된 노드들을 리스트에 넣어주고(인접리스트) 너비 우선 탐색을 한다.
- 방문하지 않은 노드는 방문을 체크할 배열이 있으므로, 방문시 무조건 처음 방문한게 보장이 되므로 그 노드의 level을 배열에 저장한다.
- 각 노드의 level이 저장된 배열의 max 값을 찾고, max와 같은 레벨의 노드의 갯수를 세면 끝!!
public int solution(int n, int[][] vertex) {
int answer = 0;
List<List<Integer>> graph = new ArrayList<>();
graph.add(new ArrayList<>());
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
for (int[] node : vertex) {
int a = node[0];
int b = node[1];
graph.get(a).add(b);
graph.get(b).add(a);
}
int[] bfs = BFS(graph);
int max = Arrays.stream(bfs).max().getAsInt();
answer = (int) Arrays.stream(bfs).filter(v -> v == max).count();
return answer;
}
public int[] BFS(List<List<Integer>> graph) {
int[] counts = new int[graph.size()];
int level = 0;
boolean[] isVisit = new boolean[graph.size()];
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
isVisit[1] = true;
while (!queue.isEmpty()) {
int qSize = queue.size();
for (int i = 0; i < qSize; i++) {
Integer node = queue.poll();
List<Integer> nodes = graph.get(node);
for (int n : nodes) {
if (!isVisit[n]) {
isVisit[n] = true;
queue.offer(n);
counts[n] = level + 1;
}
}
}
level++;
}
return counts;
}