코테 및 알고리즘

백준 js - 18126번

Jay_Jung 2024. 8. 7. 13:54

 

<문제>

 

https://www.acmicpc.net/problem/18126

 

 

 

<문제 핵심>

1. dfs를 활용하는 문제였고 1번 노드부터 시작해서 dfs를 호출하게 되는데 호출하면서 연결된 인접노드 까지 탐색하게 되고 탐색하는 과정에서 인접노드 까지의 거리를 구한다.

 

2. 입력을 보면 두번째 줄 부터 3번 째 항목에 간선의 길이가 나와있다. 즉 그래프를 생성 후 데이터를 넣어줄 때 간선의 길이까지 같이 넣어줘야 하는 문제였다.

<입력 데이터>
1  2  3
2  3  2
2  4  4
for (let i = 0; i < n - 1; i++) {
  const [a, b, c] = input[i].split(" ").map(Number);
  graph[a].push([b, c]); //c는 간선의 길이를 의미한다.
  graph[b].push([a, c]); 
}

 

3. 그래프의 형태는 입력값을 보고 그려봤다.

 

<문제 풀이과정 및 순서도>

1.  graph, distacne, visited 배열을 생성 및 초기화 해주고 반복문을 통해서 graph에 데이터를 삽입해준다.

✅ 양방향 그래프 이기 때문에 graph[a].push([b, c]), graph[b].push([a, c]) 처럼 삽입

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n");

const n = +input.shift(); //4

const graph = Array.from({ length: n + 1 }, () => []);
const distance = Array.from({ length: n + 1 }, () => 0);
const visited = Array.from({ length: n + 1 }, () => false);

for (let i = 0; i < n - 1; i++) {
  const [a, b, c] = input[i].split(" ").map(Number);
  graph[a].push([b, c]); //c는 간선의 길이를 의미한다.
  graph[b].push([a, c]);
}

 

2. dfs함수 로직을 구현한다.

✅ 방문처리한 노드를 기준으로 그래프에 접근하게 되면 인접노드와 인접노드 까지의 거리를 알 수 있다.

인접노드 까지의 거리를 구해준다음 인접노드를 다시 dfs함수로 호출하여 인접노드의 인접노드까지 거리를 구한다. 

-> 이 과정이 반복되면 이제 모든 노드를 방문한 순간이 올텐데 그때의 distance배열의 최대값을 구해준다

const dfs = (node) => {
  visited[node] = true;
  for (let [nextNode, dist] of graph[node]) {
    if (!visited[nextNode]) {
      distance[nextNode] = distance[node] + dist;
      dfs(nextNode);
    }
  }
};

dfs(1);

console.log(Math.max(...distance));

 

<전체 코드>

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n");

const n = +input.shift(); //4

const graph = Array.from({ length: n + 1 }, () => []);
const distance = Array.from({ length: n + 1 }, () => 0);
const visited = Array.from({ length: n + 1 }, () => false);

for (let i = 0; i < n - 1; i++) {
  const [a, b, c] = input[i].split(" ").map(Number);
  graph[a].push([b, c]); //c는 간선의 길이를 의미한다.
  graph[b].push([a, c]);
}

const dfs = (node) => {
  visited[node] = true;
  for (let [nextNode, dist] of graph[node]) {
    if (!visited[nextNode]) {
      distance[nextNode] = distance[node] + dist;
      dfs(nextNode);
    }
  }
};

dfs(1);

console.log(Math.max(...distance));