Lewis's Tech Keep

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

Java/알고리즘

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

Lewis Seo 2021. 8. 24. 17:32

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

 

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

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

programmers.co.kr

 

- 참고 링크 : https://dev-note-97.tistory.com/263

 

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

문제주소 :programmers.co.kr/learn/courses/30/lessons/76503 코딩테스트 연습 - 모두 0으로 만들기 각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를

dev-note-97.tistory.com

 

- 풀이

 : dfs 진행 후 역순으로 계산하며 (dfs 의 함수 호출 스택은 쌓으면 역으로 풀리는 성질 이용)

 : 각 단계에서 더해질 값을 계산

 

더보기
import java.util.*;

class Solution {
    boolean[] visited;
    List<Integer>[] edgesList;
    long[] edgeWeights;
    long sum;
    
    public long solution(int[] a, int[][] edges) {
        int edgeLen = a.length;
        for (int weight : a) {
            sum += weight;
        }
        if (sum != 0) {
            return -1;
        }
        visited = new boolean[edgeLen];
        edgeWeights = new long[edgeLen];
        edgesList = new ArrayList[edgeLen];
        for (int i=0; i<edgeLen; i++) {
            edgesList[i] = new ArrayList<Integer>();
            edgeWeights[i] = a[i];
        }
        
        for (int[] edge: edges) {
            int v1 = edge[0];
            int v2 = edge[1];
            
            edgesList[v1].add(v2);
            edgesList[v2].add(v1);
        }
        
        dfs(0);
        
        return sum;
    }
    
    public long dfs(int currV) {
        visited[currV] = true;
        
        for (int i=0; i<edgesList[currV].size(); i++) {
            int nextV = edgesList[currV].get(i);
            if (!visited[nextV]) {
                edgeWeights[currV] += dfs(nextV);
            }
        }
        
        sum += Math.abs(edgeWeights[currV]);
        
        return edgeWeights[currV];
    }
}
Comments