백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 1967 트리의 지름 [트리, 그래프, DFS]
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
문제 출처 🏠
https://www.acmicpc.net/problem/1967
문제풀이 소감 🧑💻
리프노드끼리 이어야 최장 길이가 된다는 것은 알았는데 이 노드를 서로 어떻게 이어야할지 고민이 많이 되었던 문제입니다.
한참 고민하다가 루트노드인 1에서 가장 먼 거리에 있는 노드가 최장길이를 만들 노드의 한쪽이라는 것을 힌트를 얻고 그러면 그 노드에서 가장 먼거리에 위치한 노드와의 길이가 이번 문제에서 원하는 최장 길이겠구나라는 것을 짐작할 수 있었습니다.
두번의 DFS 를 통해서 트리의 지름을 구해주었습니다.
트리의 지름에 대해서 학습하게 된 문제였고, 되게 깔끔하다는 느낌을 받았습니다. 이번 문제
이런 문제 풀고나면 괜히 기분이 좋네요 😁
요구사항 📋
노드들을 서로 이어서 경로에 있는 가중치들을 합할 때, 가장 큰 가중치의 합을 나타나내는 경우를 출력하시오.
해결 전략 📝
우선, 트리의 정보가 담긴 입력들을 가지고 트리를 만든다.
두번째 DFS 를 돌릴 때, 부모노드로 거슬러 올라가야하므로 양방향으로 트리를 만들어준다.
이후 루트노드인 1에서부터 각 자식 노드들까지 길이를 DFS 로 탐색하면서 구해준다.
탐색이 마쳤다면, 길이가 저장된 값들 중에 가장 큰 값을 가진 Index 가 최장 길이를 가지고 있는 노드중 한쪽이다.
다시 이 노드부터 시작해서 모든 노드를 탐색하여 해당 위치에서 가장 먼거리에 위치한 노드를 찾는다.
이때는 리프노드가 시작이므로 부모노드, 부모노드의 자식노드들을 모두 탐색하면서 가중치를 계산한다.
최종적으로 거리에 담긴 가장 큰 값이 트리의 지름 값이다.
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const input_N = input.shift();
const [...input_treeInfo] = input.map((v) => v.split(" ").map(Number));
function solution(N, treeInfo) {
const dfs = (node, weight) => {
tree[node].forEach((v) => {
if (distance[v[0]] === -1) {
distance[v[0]] = weight + v[1];
dfs(v[0], distance[v[0]]);
}
});
};
const tree = Array.from({ length: N + 1 }, () => []);
treeInfo.forEach((info) => {
tree[info[0]].push([info[1], info[2]]);
tree[info[1]].push([info[0], info[2]]);
});
let distance = Array.from({ length: N + 1 }).fill(-1);
distance[1] = 0;
dfs(1, 0);
let maxIndex = 0;
let maxDist = 0;
distance.forEach((v, i) => {
if (maxDist < v) {
maxIndex = i;
maxDist = v;
}
});
distance = Array.from({ length: N + 1 }).fill(-1);
distance[maxIndex] = 0;
dfs(maxIndex, 0);
const answer = Math.max(...distance);
return answer;
}
console.log(solution(Number(input_N), input_treeInfo));
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 11123 양 한마리... 양 두마리... [DFS] (0) | 2022.11.19 |
---|---|
백준/ Gold 2 문제 , 백준 Node.js 자바스크립트 1167 트리의 지름 [트리, 그래프, DFS] (0) | 2022.11.17 |
백준/ Silver 2 문제 , 백준 Node.js 자바스크립트 2961 도영이가 만든 맛있는 음식 [완전 탐색] (0) | 2022.11.15 |
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 9252 LCS 2 [최장 공통 부분 수열] (1) | 2022.11.14 |
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 1987 알파벳 [DFS] (0) | 2022.11.13 |