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;
}

댓글남기기