JS-algorithm/프로그래머스
[프로그래머스] 가장 먼 노드 (javascript)
yunieyunie
2023. 8. 21. 22:07
https://school.programmers.co.kr/learn/courses/30/lessons/49189
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 해결방법
1. 각 노드와 연결된 노드들의 리스트로 그래프 생성
2. BFS를 수행하면서 각 노드까지의 최단 거리를 distances 배열에 저장하고 최대값 개수를 반환
🔑 풀이
bfs로 풀어야 하는 문제라는 생각이 들어 지난번에 백준 DFS와 BFS 문제를 풀 때 정리해논 bfs 기본 코드를 긁어왔다.
BFS 기본 코드
// 방문한 정점을 저장하기 위한 배열
const visited = [];
// BFS 함수
function bfs(node) {
const queue = []; // 큐를 초기화
queue.push(node); // 시작 정점을 큐에 추가
visited[node] = true; // 시작 정점을 방문한 것으로 표시
while (queue.length > 0) {
const currentNode = queue.shift(); // 큐에서 정점을 하나 꺼내
console.log(`방문한 정점: ${currentNode}`); // 현재 정점 처리 (출력 등)
for (const adjacentNode of graph[currentNode]) {
// 현재 정점과 인접한 모든 정점에 대해서:
if (!visited[adjacentNode]) {
queue.push(adjacentNode); // 방문하지 않은 정점이라면 큐에 추가
visited[adjacentNode] = true; // 방문한 것으로 표시
}
}
}
}
bfs함수에서 거리를 기록하는 배열 distances 만 추가하고 distances를 리턴하도록 해줬다.
이후 노드 1부터 bfs를 돌리고 distances의 최대값 개수를 출력하면 된다.
최종 코드는 다음과 같다.
// BFS 함수
function bfs(node, graph) {
let visited = []; // 방문한 정점을 저장하기 위한 배열
let distances = Array(graph.length).fill(0); // 거리를 저장하기 위한 배열
let queue = []; // 큐를 초기화
queue.push(node); // 시작 정점을 큐에 추가
visited[node] = true; // 시작 정점을 방문한 것으로 표시
distances[node] = 0; // 시작 노드의 거리는 0
while (queue.length > 0) {
const currentNode = queue.shift(); // 큐에서 정점을 하나 꺼내
for (const adjacentNode of graph[currentNode]) {
// 현재 정점과 인접한 모든 정점에 대해서
if (!visited[adjacentNode]) {
queue.push(adjacentNode); // 방문하지 않은 정점이라면 큐에 추가
visited[adjacentNode] = true; // 방문한 것으로 표시
distances[adjacentNode] = distances[currentNode] + 1; // 현재 노드의 거리 + 1
}
}
}
return distances;
}
function solution(n, edge) {
// 그래프 생성
let graph = [...Array(n + 1)].map(() => []);
for (const [to, from] of edge) {
graph[from].push(to);
graph[to].push(from);
}
const distances = bfs(1, graph);
const max = Math.max(...distances); // 거리 중 최대값
return distances.filter((val) => val === max).length;
}