개발자 톡

연습문제 톡 [21년 재직자 대회 본선] 거리 합 구하기

JS 런타임 에러

등록일
2024-11-13 18:11:41
조회수
71
작성자
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년_재직자_대회_본선]_거리_합_구하기

이 카테고리의 톡 더보기