[프로그래머스] 모두 0으로 만들기
2021년 04월 16일, 12:10
모두 0으로 만들기
문제풀이
DFS로 푸는 문제인데, 상당히 조건이 까다로웠다.
우선, 자바스크립트로 재귀로 풀면 터져버린다. 파이썬의 경우 내부적으로 재귀함수 Limit을 바꿀 수 있지만,
자바스크립트는 불가능한 것 같다.(실행 시킬 때 nodejs의 경우 지정할 수 있는듯?)
그래서 반복문으로 풀어야한다. 또 까다로웠던 점은 숫자의 크기가 커서 BigInt를 사용해서 합을 구해야한다.(안그럼 틀림)
- 트리로 주어졌으니 임의의 한 점에서 부터 dfs로 탐색 후 리프노드에서부터 가중치를 더한다.
소스코드
function solution(a, edges) {
let answer = 0n;
const adj = Array.from(Array(a.length), () => []);
const visited = Array(a.length).fill(false);
edges.forEach(e => {
const [u, v] = e;
adj[u].push(v);
adj[v].push(u);
});
if(a.reduce((acc,val) => acc+val, 0) !== 0) return -1;
const arr = [[0, null]];
while(arr.length){
const [start, parent] = arr.pop();
if(visited[start]){
answer += BigInt(Math.abs(Number(a[start])));
a[parent] += a[start];
a[start] = 0;
continue;
}
visited[start] = true;
arr.push([start, parent]);
for(const v of adj[start]){
if(visited[v]) continue;
arr.push([v, start]);
}
}
return Number(answer);
}