diff --git "a/Programmers/Level3/49189_\352\260\200\354\236\245_\353\250\274_\353\205\270\353\223\234.js" "b/Programmers/Level3/49189_\352\260\200\354\236\245_\353\250\274_\353\205\270\353\223\234.js" new file mode 100644 index 0000000..1b4d882 --- /dev/null +++ "b/Programmers/Level3/49189_\352\260\200\354\236\245_\353\250\274_\353\205\270\353\223\234.js" @@ -0,0 +1,46 @@ +/* +⭐️ 문제 정보 ⭐️ +문제 : 49189 - 가장 먼 노드 +레벨 : Level 3 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49189 +*/ + +// ANCHOR : 26.02.04 풀이 +/** + APPROACH: + 하나의 노드에서 다른 노드"들"까지의 최단경로를 구해야 하는 문제이기 때문에 다익스트라 알고리즘을 먼저 생각했었음. + 하지만 이 문제는 모든 간선의 가중치가 1로 동일하기 때문에 다익스트라를 쓰지 않고 BFS만으로도 각 노드까지의 최단거리를 구할 수 있다. +*/ +function solution(n, edge) { + const adj = Array.from({ length: n + 1 }, () => []); + for (const [a, b] of edge) { + adj[a].push(b); + adj[b].push(a); + } + + // -1은 아직 모르는 거리를 의미함 + // NOTE : BFS에서는 첫 방문 거리가 곧 최단거리이므로 (다익스트라처럼 갱신 x) Infinity 대신 -1을 쓴다. + const dist = Array.from({ length: n + 1 }, () => -1); + + // BFS 시작 + dist[1] = 0; // 시작 지점 + const queue = [1]; + let head = 0; + while (head < queue.length) { + const front = queue[head++]; + const neighbors = adj[front]; + if (neighbors.length === 0) continue; + + neighbors.forEach((neighbor) => { + if (dist[neighbor] !== -1) return; + // 처음 방문하는 시점이 바로 최단거리이므로 주저없이 업데이트 + // 방문 기록은 겸사겸사 + dist[neighbor] = dist[front] + 1; + queue.push(neighbor); + }); + } + + const maxDist = Math.max(...dist); + const answer = dist.filter((d) => d === maxDist).length; + return answer; +} diff --git a/Programmers/README.md b/Programmers/README.md index 4d8ca37..4869032 100644 --- a/Programmers/README.md +++ b/Programmers/README.md @@ -42,6 +42,7 @@ | 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) | | 42889 | 실패율 | [42889_실패율.js](Level1/42889_실패율.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42889) | | 43162 | 네트워크 | [43162_네트워크.js](Level3/43162_네트워크.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/43162) | +| 49189 | 가장 먼 노드 | [49189_가장_먼_노드.js](Level3/49189_가장_먼_노드.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49189) | | 49993 | 스킬트리 | [49993_스킬트리.js](Level2/49993_스킬트리.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49993) | | 49994 | 방문 길이 | [49994_방문_길이.js](Level2/49994_방문_길이.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49994) | | 60057 | 문자열 압축 | [60057_문자열_압축.js](Level2/60057_문자열_압축.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60057) |