모바일 개발하는 자바리안의 메모장

자바(JAVA) - 모두 0으로 만들기(Programmers : 76503) 본문

Java/Java.algorithm

자바(JAVA) - 모두 0으로 만들기(Programmers : 76503)

자바리안 2021. 6. 10. 14:50
반응형

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

 

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

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

programmers.co.kr

 

생각했던것보다 아주 많이,, 오래 걸린 문제.

가중치를 어떻게 올바르게 카운트 할 수 있을지 너무 어렵게 생각했던 것 같다..
반환값이 long인 부분을 고려하여 입력값을 long 타입으로 옮겨주는 작업,
그리고 아직도 왜 그런지 모르겠지만 변수화 여부에 따라 결과값이 다르게 나오던 문제를 해결하고나서야 겨우 All Pass를 받을 수 있었다..

 

실행 순서는 다음과 같다 :

    1. int[] a > long 타입 배열에 입력

    2. 모든 weight를 더하여 0이 아닌 경우 -1 반환

    3. 간선 정보 ArrayList 배열에 입력

    4. DFS를 통해 각 가중치 업데이트하며 + 업데이트된 가중치 Count

 

<코드>

import java.util.*;

class Solution {
	long answer = 0;
	ArrayList<Integer>[] adjList;
	int len;
	boolean[] visited;
	long[] longAns;

	public long solution(int[] a, int[][] edges) {
		this.len = a.length;
		this.adjList = new ArrayList[this.len];
		this.visited = new boolean[this.len];
		this.longAns = new long[this.len];

		long s = 0;

		for (int i = 0; i < this.len; i++) {
			this.longAns[i] = a[i];
			s += a[i];
			this.adjList[i] = new ArrayList<Integer>();
		}

		// input 유효성 확인 - 전체 합이 0이 아닐 경우 불가능
		if (s != 0) {
			return -1;
		}

		// 간선 정보 adjList 에 입력
		for (int[] edge : edges) {
			int node1 = edge[0];
			int node2 = edge[1];
			this.adjList[node1].add(node2);
			this.adjList[node2].add(node1);
		}

		dfs(0);

		return answer;
	}

	public long dfs(int index) {
		this.visited[index] = true;

		// 간선 노드를 확인하며 가중치 업데이트
		for (int i = 0; i < this.adjList[index].size(); i++) {
			int curr = this.adjList[index].get(i);
			if (visited[curr] == false) {
				this.longAns[index] += dfs(curr);
			}
		}
		this.answer += Math.abs(longAns[index]);
		return longAns[index];
	}
}
반응형
Comments