예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.
∮ 알고리즘 만들기
1. 그래프로 주어진 간선 정보(vertex)를 노드별 연결된 노드 리스트로 데이터화한다. 1-1. 노드 번호를 key로, 연결된 노드 리스트를 value로 하는 Map을 만든다. 2. Map을 통해 너비 우선 탐색(BFS)를 통해 모든 노드와의 최소 거리를 계산한다. 2-1. 현재 탐색한 최대 거리를 체크하여 해당 노드의 개수를 확인한다. 3. 체크한 최대 거리의 노드들의 개수를 반환한다.
이번 가장 먼 노드 문제 풀이 알고리즘은 그래프 정보를 접근하기 편한 데이터로 만든 후, 너비 우선 탐색을 통해 1번 노드와의 가장 먼 노드의 개수를 체크하는 것이 포인트입니다.
∮ 코드 구현
function solution(n, edge) {
let maxDistance = 0, count = 0;
const edgeMap = new Map();
// 1. 그래프로 주어진 간선 정보(vertex)를 노드별 연결된 노드 리스트로 데이터화한다.
edge.forEach((value) => {
// 1-1. 노드 번호를 key로, 연결된 노드 리스트를 value로 하는 Map을 만든다.
edgeMap.set(value[0], edgeMap.get(value[0]) ? [...edgeMap.get(value[0]), value[1]] : [value[1]]);
edgeMap.set(value[1], edgeMap.get(value[1]) ? [...edgeMap.get(value[1]), value[0]] : [value[0]]);
});
// 2. Map을 통해 너비 우선 탐색(BFS)를 통해 모든 노드와의 최소 거리를 계산한다.
const queue = [[1, 0]];
const visited = [];
while(queue.length > 0) {
// 2-1. 현재 탐색한 최대 거리를 체크하여 해당 노드의 개수를 확인한다.
const [node, distance] = queue.shift();
// 3. 체크한 최대 거리의 노드들의 개수를 반환한다.
if(maxDistance < distance) {
maxDistance = distance;
count = 1;
} else if(maxDistance === distance) {
count++;
}
visited[node] = true;
for(let nextNode of edgeMap.get(node)) {
if(visited[nextNode] !== true) {
visited[nextNode] = true;
queue.push([nextNode, distance+1]);
}
}
}
return count;
}
∮ 채점 결과
오늘의 문제인 가장 먼 노드 문제 풀이 채점 결과는 정확성 테스트 케이스 9개를 모두 통과하였습니다. JavaScript로 가장 먼 노드 문제 풀이를 한 결과이니 참고하시기 바랍니다.
댓글