class Queue{
constructor(){
this.queue = [];
this.front = 0;
this.rear = 0;
}
enqueue(value){
this.queue[this.rear++] = value;
}
dequeue(){
const value = this.queue[this.front];
delete this.queue[this.front];
this.front += 1;
return value;
}
size(){
return this.rear - this.front;
}
}
function solution(n, edge) {
const distArr = [];
const visited = new Array(n + 1).fill(false); // 노드의 개수가 n개 이므로 n개 노드의 방문 여부를 확인 할 수 있는 배열
const map = Array.from(Array(n + 1), () => Array(0).fill(null)); // n개의 노드가 어느 노드랑 연결 되었는지 확인할 수 있는 map 배열
const que = new Queue(); // [1번 노드에서 시작, 1번 노드에서의 거리]
// 각 노드끼리 간선 정보 연결
for(let i = 0; i < edge.length; i++){
map[edge[i][0]].push(edge[i][1]);
map[edge[i][1]].push(edge[i][0]);
}
// 1번 노드의 경우 시작점이므로 방문 여부 true
visited[1] = true;
que.enqueue([1, 0]);
// BFS로 노드 방문 탐색
while(que.size() !== 0){
const curNode = que.dequeue();
const curNum = curNode[0]; // 현재 노드 번호
const curDist = curNode[1]; // 1번 노드에서 현재 노드까지의 거리
distArr.push(curDist); // 현재 노드까지의 거리를 distArr 배열에 저장
// 현재 노드에서 연결된 간선의 정보를 회문탐색
for(let i = 0; i < map[curNum].length; i++){
// 연결된 노드중 방문 정보가 없을 경우 방문 여부 true로 변환 후 다음 방문할 노드 정보 push
if( visited[map[curNum][i]] === false){
visited[map[curNum][i]] = true;
que.enqueue([map[curNum][i], curDist + 1]);
}
}
}
// 1번 노드에서 방문했던 노드들의 거리중 가장 멀리 떨어진 노드의 거리
const maxDist = Math.max(...distArr);
// 1번 노드에서 가장 멀리 떨어진 노드의 거리의 개수 return
return distArr.filter(element => maxDist === element).length;
}
댓글남기기