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
'컴공생의 Knowledge > Algoritm Solution' 카테고리의 다른 글
[프로그래머스] 2021 카카오 인턴 - 숫자 문자열과 영단어 문제 풀이 (feat.JS) (15) | 2022.08.21 |
---|---|
[프로그래머스] 그래프 - 순위 문제 풀이 (feat.JS) (20) | 2022.08.19 |
[프로그래머스] 이분탐색 - 입국심사 문제 풀이 (feat.JS) (26) | 2022.08.17 |
[프로그래머스] 깊이/너비 우선 탐색 - 퍼즐 조각 채우기 문제 풀이 (feat.JS) (19) | 2022.08.16 |
[프로그래머스] 깊이/너비 우선 탐색 - 여행경로 문제 풀이 (feat.JS) (13) | 2022.08.15 |
댓글