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

유존돌돌이·2022년 1월 14일
0

Programmers

목록 보기
143/167
post-thumbnail

문제 설명

각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를 0으로 만들고자 합니다.

임의의 연결된 두 점을 골라서 한쪽은 1 증가시키고, 다른 한쪽은 1 감소시킵니다.
하지만, 모든 트리가 위의 행동을 통하여 모든 점들의 가중치를 0으로 만들 수 있는 것은 아닙니다. 당신은 주어진 트리에 대해서 해당 사항이 가능한지 판별하고, 만약 가능하다면 최소한의 행동을 통하여 모든 점들의 가중치를 0으로 만들고자 합니다.

트리의 각 점의 가중치를 의미하는 1차원 정수 배열 a와 트리의 간선 정보를 의미하는 edges가 매개변수로 주어집니다. 주어진 행동을 통해 트리의 모든 점들의 가중치를 0으로 만드는 것이 불가능하다면 -1을, 가능하다면 최소 몇 번만에 가능한지를 찾아 return 하도록 solution 함수를 완성해주세요. (만약 처음부터 트리의 모든 정점의 가중치가 0이라면, 0을 return 해야 합니다.)

제한사항

a의 길이는 2 이상 300,000 이하입니다.
a의 모든 수는 각각 -1,000,000 이상 1,000,000 이하입니다.
a[i]는 i번 정점의 가중치를 의미합니다.
edges의 행의 개수는 (a의 길이 - 1)입니다.
edges의 각 행은 [u, v] 2개의 정수로 이루어져 있으며, 이는 u번 정점과 v번 정점이 간선으로 연결되어 있음을 의미합니다.
edges가 나타내는 그래프는 항상 트리로 주어집니다.

Comment

import java.util.*;
class Solution {
    private long ret;
	private Map<Integer, List<Integer>> hm;
    
    public long solution(int[] a, int[][] edges) {
        hm = new HashMap<>();
		ret = 0;
        boolean[] visit = new boolean[a.length];
		for(int[] e : edges) {
			if(!hm.containsKey(e[0])) hm.put(e[0], new ArrayList<>());
			hm.get(e[0]).add(e[1]);
			if(!hm.containsKey(e[1])) hm.put(e[1], new ArrayList<>());
			hm.get(e[1]).add(e[0]);
		}
		return helper(visit, a, 0)!=0?-1:ret;
	}
	
	public long helper(boolean[] visit, int[] a, int i) {
		visit[i] = true;
		long num = (long)a[i];
		for(int idx : hm.get(i)) {
			if(visit[idx]) continue;
			num += helper(visit, a, idx);
		}
		ret += Math.abs(num);
		return num;
    }
}

Comment

위의 코드로 하면 6,7,8 테스트 케이스 런타임 오류가 나온다. 거의 반나절동안 찾다가 도저히 모르겠어서 다른 사람의 코멘트를 봤는데, 문제 자체에서 런타임 오류가 나오는거에 좀 의문이 생기는 문제로 보인다.

0개의 댓글