개발자 톡
연습문제 톡
[21년 재직자 대회 본선] 거리 합 구하기
JS 런타임 에러
- 등록일
- 2024-11-13 18:11:41
- 조회수
- 157
- 작성자
- vavoya6324
런타임 에러 번호
32-2
34-2
50-2
52-2
54-2
다른 글에도 런타임 에러라는데 문제가 문제인건가요?
// 입력처리
const fs = require('fs')
const input = fs.readFileSync('input.txt', 'utf8')
.trim()
.split(/\n+/)
const nodeCount = +input[0]
const edges = input.slice(1).map(v => v.trim().split(' ').map(Number))
const edgesObj = {}
const weightSum = Array.from({length: nodeCount + 1}, () => [0, 0])
let rootNode = null
edges.forEach(edge => {
const [n, m, w] = edge
if (rootNode === null) rootNode = n
if (n in edgesObj) {
edgesObj[n].push([m, w])
}
else {
edgesObj[n] = [[m, w]]
}
if (m in edgesObj) {
edgesObj[m].push([n, w])
}
else {
edgesObj[m] = [[n, w]]
}
})
function getWeightFromChild(node, child, w) {
const [childW, count] = weightSum[child]
weightSum[node] = [childW + (count + 1) * w + weightSum[node][0], count + 1 + weightSum[node][1]]
}
function dfs(node, parent) {
// 간선이 존재하면
if (node in edgesObj) {
edgesObj[node].forEach(edge => {
const [n, w] = edge
if (n !== parent) {
dfs(n, node)
// 자식 노드가 정보를 얻어왔으니 달라고 요구하기
getWeightFromChild(node, n, w)
}
})
}
}
function getWeightFromParent(node, parent, w) {
// 전체 가중치에서
// 그 외의 노드 개수 만큼 부모 ~ 본인 거리 가중치 더하기
let totalSum = weightSum[parent][0]
// 자기 자신, 자식 노드의 개수 만큼 부모 ~ 본인 거리 가중치 빼기
totalSum -= w * (weightSum[node][1] + 1)
// 본인, 자식 제외한 노드와의 거리를 위해 나머지 노드 개수 만큼 더하기
totalSum += w * (nodeCount - weightSum[node][1] - 1)
weightSum[node] = [totalSum, weightSum[node][1]]
}
function dfs2(node, parent, weight) {
// 부모로부터 정보 얻기. 있으면
if (parent) {
getWeightFromParent(node, parent, weight)
}
if (node in edgesObj) {
edgesObj[node].forEach(edge => {
const [n, w] = edge
if (n !== parent) {
dfs2(n, node, w)
}
})
}
}
// 1을 루트 노드로 하기
dfs(rootNode, null)
dfs2(rootNode, null)
const result = []
for (let i = 1; i < weightSum.length; i++) {
result.push(weightSum[i][0])
}
console.log(result.join('\n'))
/*
자 보자.. 그래프 탐색은 해야한다
DFS로 알 수 있는 정보
1. 자식 노드 까지의 거리
부모 노드는 자식 노드가 가진 가중치를 기반으로 자신의 자식 노드들에 대한 거리를 얻는다.
자식 노드는 부모 노드를 통해서 자신의 자식 노드 외의 정보를 얻는다.
각 노드 까지의 가중치를 구하고 더하는 것은 시간이 오버된다. (가중치를 구해두는 것에)
*/
#[21년_재직자_대회_본선]_거리_합_구하기