본문 바로가기
컴공생의 Knowledge/Algoritm Solution

[프로그래머스] 그래프 - 가장 먼 노드 문제 풀이 (feat.JS)

by UIC 2022. 8. 18.
728x90

오늘은 프로그래머스의 가장 마지막 테마인 그래프 문제 중 가장 먼 노드 문제 풀이를 해보겠습니다. 오늘도 역시 Javascript로 가장 먼 노드 문제 풀이를 진행할 예정이니 참고해주시기 바랍니다. 

 

 

프로그래머스 > 그래프 > 가장 먼 노드 문제 풀이

 

 

프로그래머스-그래프-가장-먼-노드-문제정보

 

 

∮ 문제 정보

  • 문제명: 가장 먼 노드
  • 문제 난이도: Level 3
  • 문제 푼 사람 수: 12498명
  • 사용 가능 언어: 11개 (JavaScript 사용)

 

 

 

 

∮ 문제 설명

n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.

노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.

 

 

  • 그래프에서 1번 노드와 가장 멀리 떨어진 노드의 개수 구하기
  • Inputs
    • n: 노드의 개수
    • vertex: 노드의 간선 정보(2차원 배열)
  • Output: 1번 노드로부터 가장 멀리 떨어진 노드의 개수

 

 

 

 

∮ 제한 사항

º 노드의 개수 n은 2 이상 20,000 이하입니다.
º 간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.
º vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.

 

 

  • 2 ≤ 노드의 개수(n) ≤ 20,000
  • 간선은 양방향, 1 ≤ 간선의 개수 ≤ 50,000
  • vertex 배열의 원소는 [a, b] : a번 노드와 b번 노드가 연결되어있다는 의미

 

 

 

 

∮ 입출력 예

n vertex return
6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

 

 

 

 

∮ 입출력 예 설명

예제의 그래프를 표현하면 아래 그림과 같고, 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로 가장 먼 노드 문제 풀이를 한 결과이니 참고하시기 바랍니다.

 

 

728x90

댓글