https://programmers.co.kr/learn/courses/30/lessons/76503
๋ฌธ์
๊ฐ ์ ์ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋๋ค. ๋น์ ์ ๋ค์ ์ฐ์ฐ์ ํตํ์ฌ, ์ด ํธ๋ฆฌ์ ๋ชจ๋ ์ ๋ค์ ๊ฐ์ค์น๋ฅผ 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๊ฐ ๋ํ๋ด๋ ๊ทธ๋ํ๋ ํญ์ ํธ๋ฆฌ๋ก ์ฃผ์ด์ง๋๋ค.
์์
์ ์ถ๋ ฅ ์
a | edges | result |
[-5,0,2,1,2] | [[0,1],[3,4],[2,3],[0,3]] | 9 |
[0,1,0] | [[0,1],[1,2]] | -1 |
์ ์ถ๋ ฅ ์ #1
- ๋ค์ ๊ทธ๋ฆผ์ ์ฃผ์ด์ง ํธ๋ฆฌ์ ๋ชจ๋ ์ ์ ์ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ํ๋ธ ๊ฒ์ ๋๋ค.
- 2๋ฒ ์ ์ ๊ณผ 3๋ฒ ์ ์ ์ ์ ํํ์ฌ 2๋ฒ ์ ์ ์ 1 ๊ฐ์์ํค๊ณ , 3๋ฒ ์ ์ ์ 1 ์ฆ๊ฐ์ํต๋๋ค. (2๋ฒ ๋ฐ๋ณต)
- 3๋ฒ ์ ์ ๊ณผ 4๋ฒ ์ ์ ์ ์ ํํ์ฌ 4๋ฒ ์ ์ ์ 1 ๊ฐ์์ํค๊ณ , 3๋ฒ ์ ์ ์ 1 ์ฆ๊ฐ์ํต๋๋ค. (2๋ฒ ๋ฐ๋ณต)
- 0๋ฒ ์ ์ ๊ณผ 3๋ฒ ์ ์ ์ ์ ํํ์ฌ 3๋ฒ ์ ์ ์ 1 ๊ฐ์์ํค๊ณ , 0๋ฒ ์ ์ ์ 1 ์ฆ๊ฐ์ํต๋๋ค. (5๋ฒ ๋ฐ๋ณต)
- ๋ชจ๋ ์ ์ ์ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก ๋ง๋๋ ๋ฐ ํ์ํ ์ต์ ํ๋ ํ์๋ 9๋ฒ์ด๋ฏ๋ก, 9๋ฅผ return ํด์ผ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ์ฃผ์ด์ง ํธ๋ฆฌ๋ ๋ชจ๋ ์ ์ ์ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, -1์ return ํด์ผ ํฉ๋๋ค.
ํ์ด
๋ชจ๋ ๋ ธ๋์ ๊ฐ์ค์น์ ํฉ์ด 0์ด ๋์ง ์์ผ๋ฉด ๐ ๋ชจ๋ ๋ ธ๋๋ฅผ 0์ผ๋ก ๋ง๋ค ์ โ return -1
๋ชจ๋ ๋ ธ๋์ ๊ฐ์ค์น์ ํฉ์ด 0์ด๋ฉด ๐ ์ฐ๊ฒฐ๋ ๋ ธ๋๊ฐ 1๊ฐ์ธ ๋ ธ๋๋ถํฐ 0์ผ๋ก ๋ง๋ค๊ธฐ ์์ โผ๏ธ
1๏ธโฃ ํ์ ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ 1๊ฐ์ธ ๋
ธ๋ ์ฆ, leaf node
๋ค์ ์ ์ฅ
2๏ธโฃ ํ์ ์ ์ฅ๋ ๋
ธ๋now
์ ๊ฐ์ค์น๋ฅผ 0์ผ๋ก
โก๏ธ ์ฐ๊ฒฐ๋ ๋
ธ๋next
์ now์ ๊ฐ์ค์น๋งํผ โ
โก๏ธ next์ indegree −
3๏ธโฃ next์ indegree๊ฐ 1 ์ด๋ฉด ํ์ ์ถ๊ฐ
์ฝ๋
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class ๋ชจ๋0์ผ๋ก๋ง๋ค๊ธฐ {
static ArrayList<Integer> adj[];
static boolean[] isVisited;
static int[] indegree;
static long[] longA;
static long answer;
public static long solution(int[] a, int[][] edges) {
answer = 0;
longA = new long[a.length];
adj = new ArrayList[a.length];
indegree = new int[a.length];
isVisited = new boolean[a.length];
long sum = 0;
for(int i = 0 ; i < a.length ; i++){
sum += a[i];
longA[i] = a[i];
adj[i] = new ArrayList<>();
}
if(sum != 0)
return -1;
for(int i = 0 ; i < edges.length ; i++){
adj[edges[i][0]].add(edges[i][1]);
adj[edges[i][1]].add(edges[i][0]);
indegree[edges[i][0]]++;
indegree[edges[i][1]]++;
}
BFS();
return answer;
}
private static void BFS() {
Queue<Integer> queue = new LinkedList<>();
for(int i = 0 ; i < indegree.length ; i++){
if(indegree[i] == 1)
queue.offer(i);
}
while(!queue.isEmpty()){
int now = queue.poll();
isVisited[now] = true;
for(int next : adj[now]){
if(!isVisited[next]){
indegree[next]--;
longA[next] += longA[now];
answer += Math.abs(longA[now]);
longA[now] = 0;
if(indegree[next] == 1)
queue.offer(next);
}
}
}
}
public static void main(String[] args) {
int[] a = {-5, 0, 2, 1, 2};
int[][] edges = {{0, 1}, {3, 4}, {2, 3}, {0,3}};
System.out.println(solution(a, edges));
}
}