ํ๋ก๊ทธ๋๋จธ์ค / ์๊ฐ ์ฝ๋ ์ฑ๋ฆฐ์ง ์์ฆ2 / ๋ชจ๋ 0์ผ๋ก ๋ง๋ค๊ธฐ
https://school.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 ํด์ผ ํฉ๋๋ค.
๋์ ํ์ด
์ด ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ณด์์ ๋ DFS๋ฅผ ์จ์ ์์์ ๋ ฌ๋ก ํ์ด์ผํ๋ค๋ ๊ฑธ ์์๋ค. ํ์ง๋ง ๋งค๋ฒ ํ์ด๊ฐ ์ง๊ด์ ์ผ๋ก ๋ณด๊ธฐ ์ฌ์ด ์ธ์ ํ๋ ฌ์ ์ผ์ด์ ์ด ๋ฌธ์ ๋ํ ์ธ์ ํ๋ ฌ๋ก ํ์ด ๋ฒ๋ ธ๋ค.
์ธ์ ํ๋ ฌ ํ์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import java.util.*;
public class makeAllZero2_matrix {
static long answer = 0;
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));
}
public static long solution(int[] a, int[][] edges) {
int nodeNum = a.length;
int[][] graph = new int[nodeNum][nodeNum];
for (int i = 0; i < edges.length; i++) {
graph[edges[i][0]][edges[i][1]] = 1;
graph[edges[i][1]][edges[i][0]] = 1;
}
Stack<Integer> dfs = new Stack<>();
Stack<Integer> order = new Stack<>();
Set<Integer> visited = new HashSet<>();
dfs.push(0);
visited.add(0);
while (dfs.size() != 0) {
int nextNode = dfs.pop();
order.push(nextNode);
for (int i = 0; i < nodeNum; i++) {
if (graph[nextNode][i] == 1 && !visited.contains(i)) {
dfs.push(i);
visited.add(i);
}
}
}
Set<Integer> visited2 = new HashSet<>();
while (order.size() > 1) {
int leafNode = order.pop();
visited2.add(leafNode);
for (int i = 0; i < nodeNum; i++) {
if (graph[leafNode][i] == 1 && !visited2.contains(i)) {
a[i] += a[leafNode];
answer += Math.abs(a[leafNode]);
}
}
}
if (a[0] + a[order.peek()] == 0) {
return answer + Math.abs(a[order.peek()]);
} else {
return -1;
}
}
}
|
cs |
์ ์ถ ๊ฒฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ด๋ค.
ํ์ง๋ง ๋ฌธ์ ์์ ์ํ๋ ์ ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ปด์ ํธ๋ ๋ฐฉ์์ ์ํ ๊ฒ์ด๋ค.
(๊ทธ๋ฆฌ๊ณ ๊ฐ์ค์น๋ฅผ ๋ํด์ ์ ์ฅํ long[] ๋ํ ๋ง๋ค์ด์ฃผ์ง ์์ ํ๋ฆฐ ๋ต์ด๊ธฐ๋ ํ๋ค. long[]์ ๋ง๋ค์ด์ ๋ฃ์ด์ฃผ์ด ๋ฉ๋ชจ๋ฆฌ์ ํ์ด ์๋ ์ ์ถ์ง์ ์ ์ถํ๋ค๋ฉด ์๋ง ์ ๋ต์ฒ๋ฆฌ ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.)
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ก ์ธํด ์ธ์ ๋ฆฌ์คํธ๋ก ๋ค์ ํ์๋ค.
์ธ์ ๋ฆฌ์คํธ ํ์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
public class makeAllZero2_list_answer2 {
static long answer = 0;
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));
}
public static long solution(int[] a, int[][] edges) {
int nodeNum = a.length;
long[] answerArr = new long[nodeNum + 1];
for (int i = 0; i < nodeNum; i++) {
answerArr[i] = a[i];
}
List<List<Integer>> connection = new ArrayList<>();
for (int i = 0; i <= nodeNum; i++) {
connection.add(new ArrayList<>());
}
for (int i = 0; i < nodeNum - 1; i++) {
connection.get(edges[i][0]).add(edges[i][1]);
connection.get(edges[i][1]).add(edges[i][0]);
}
Stack<Integer> dfs = new Stack<>();
Stack<Integer> order = new Stack<>();
Set<Integer> visited = new HashSet<>();
dfs.push(0);
visited.add(0);
while (dfs.size() != 0) {
int nextNode = dfs.pop();
order.push(nextNode);
for (int i = 0; i < connection.get(nextNode).size(); i++) {
if (!visited.contains(connection.get(nextNode).get(i))) {
dfs.push(connection.get(nextNode).get(i));
visited.add(connection.get(nextNode).get(i));
}
}
}
Set<Integer> visited2 = new HashSet<>();
while (order.size() > 1) {
int leafNode = order.pop();
visited2.add(leafNode);
for (int i = 0; i < connection.get(leafNode).size(); i++) {
if (!visited2.contains(connection.get(leafNode).get(i))) {
answerArr[connection.get(leafNode).get(i)] += answerArr[leafNode];
answer += Math.abs(answerArr[leafNode]);
}
}
}
if (answerArr[0] + answerArr[order.peek()] == 0) {
return answer + Math.abs(answerArr[order.peek()]);
}
return -1;
}
}
|
cs |
์ธ์ ํ๋ ฌ์ ์ง๊ด์ ์ผ๋ก ๋ ธ๋์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ด ์ข์ง๋ง, ์ด์ค ๋ฐฐ์ด์ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ๋ ธ๋์ ์๊ฐ ๋ง์์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋จ๊ธฐ ์ฝ์์ด๋ค. ๋ฐ๋ผ์
์ธ์ ๋ฆฌ์คํธ ํ์ด ๋ฒ์ด ๋ ์์ ํ๊ฒ ํ ์ ์๋ค.
๋๊ธ