본문 바로가기

알고리즘/프로그래머스

[프로그래머스] 모두 0으로 만들기 / JAVA

문제링크 : https://programmers.co.kr/learn/courses/30/lessons/76503

 

코딩테스트 연습 - 모두 0으로 만들기

각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를 0으로 만들고자 합니다. 임의의 연결된 두 점을 골라서 한쪽은 1 증가시키고, 다른 한

programmers.co.kr

import java.util.*;
class Solution {
    public static int inorder[];
    public static ArrayList<Integer>adj[];
    public static boolean visited[];
    public static int par[];
    public static void dfs(int node){
        int childCnt = 0;
        for(int i=0;i<adj[node].size();i++){
            int next = adj[node].get(i);
            if(visited[next])continue;
            visited[next] = true;
            childCnt++;
            dfs(next);
            par[next] = node;
        }
        inorder[node] = childCnt;
    }
    public static long solution(int []a, int[][]edges){
        long answer = 0;
        inorder = new int[a.length];
        adj = new ArrayList[a.length];
        visited = new boolean[a.length];
        par = new int[a.length];
        long copyArr[] = new long[a.length];
        for(int i=0;i<a.length;i++){
            adj[i] = new ArrayList<Integer>();
            copyArr[i] = a[i];
        }
        for(int i=0;i<edges.length;i++){
            int start = edges[i][0];
            int end = edges[i][1];
            adj[start].add(end);
            adj[end].add(start);
        }
        visited[0] = true;
        par[0] = -1;
        dfs(0);
        Queue<Integer> q = new LinkedList<Integer>();
        for(int i=0;i<a.length;i++){
            if(inorder[i]==0){
                q.add(i);
            }
        }
        while(!q.isEmpty()){
            int curNode = q.poll();
            int parent = par[curNode];
            if(parent==-1){
                if(copyArr[curNode]==0){
                    return answer;
                }
                return -1;
            }

            copyArr[parent] += copyArr[curNode];
            answer += Math.abs(copyArr[curNode]);
            inorder[parent]--;
            if(inorder[parent]==0){
                q.add(parent);
            }
        }

        return answer;
    }
}