[PS] 99ν΄λ½ μ½ν μ€ν°λ 36μΌμ°¨ TIL (μ λ ₯λ§μ λλ‘ λλκΈ°)
νκ·Έ: 99ν΄λ½, BFS/DFS, PS, TIL, μμ νμ, μ½λ©ν μ€νΈμ€λΉ, νν΄99
μΉ΄ν κ³ λ¦¬: PS
λ¬Έμ
μ€λͺ
μ΅μ΄ κ·Έλν κ°μ μ λ³΄κ° μ£Όμ΄μ§κ³ , ν΄λΉ κ·Έλνμμ κ°μ μ νλμ© λμμ λ λ λΆλΆμΌλ‘ λλμ΄μ§λ κ·Έλνμ λ Έλ μ μ°¨μ΄κ° μ΅μκ° λλλ‘ νλ λ¬Έμ
νμ΄
μ μμλ₯Ό μΈμ νλ ¬ κ·Έλνλ‘ λνλ΄λ©΄ μλμ κ°λ€.
-
graph μ μΈ : μ μ κ³Ό κ°μ μ λ³΄κ° μ£Όμ΄μ§λ―λ‘ ν΄λΉ μ’νλ₯Ό μλ°©ν₯ μ°κ²°νκΈ° μν΄
int[][]
λ‘ graph λ₯Ό μ μΈν΄μ€¬λ€.boolean[][]
λ‘ μ μΈν΄λ μκ΄μλ€. - graph μΈν
: μλ°©ν₯ μ°κ²°μ μν΄ λ€μκ³Ό κ°μ΄ κ·Έλν μ΄κΈ° μΈν
μ μ§ννλ€.
1 2
graph[wire[0]][wire[1]] = 1; graph[wire[1]][wire[0]] = 1;
- κ°μ λκΈ° : λ€μκ³Ό κ°μ΄ κ°μ μ νλμ© λμμ λμ λ
Έλ μλ₯Ό μΌλ€.
1 2 3 4 5
// κ°μ μ λκ³ graph[u][v] = 0; graph[v][u] = 0; // κ·Έ κ·Έλνλ₯Ό dfs λλ¦°λ€. λ¬Έμ μμ n μ μμ°μλΌκ³ νμΌλ―λ‘ graph λ 1λΆν° μΈν λμ΄ μλ€. dfs(1, visited, graph);
- λ
Έλ μ μ°¨μ΄κ° μ΅μκ° λλ κ° μ°ΎκΈ° : dfs μμ μ°Ύμ ν κ·Έλνμ λ
Έλ μκ°
count
λΌλ©΄, λλ¨Έμ§ κ·Έλνμ λ Έλ μλn - count
κ° λλ€. μ΄ λ μμ μ°¨μ΄λ₯Ό ꡬνκ³ κΈ°μ‘΄μ μ΅μκ° λ³΄λ€ μμ κ²½μ°minDiff
λ₯Ό κ°±μ ν΄ λκ°λ€. - κ°μ 볡ꡬ : λμλ κ°μ μ λ€μ μ°κ²°μμΌ μ£Όκ³ , λ€μ wire μ λν΄ νμνλ€.
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
class Solution {
static int[][] graph;
static boolean[] visited;
public int solution(int n, int[][] wires) {
graph = new int[n + 1][n + 1];
for (int[] wire : wires) {
graph[wire[0]][wire[1]] = 1;
graph[wire[1]][wire[0]] = 1;
}
int minDiff = Integer.MAX_VALUE;
for (int[] wire : wires) {
int u = wire[0];
int v = wire[1];
graph[u][v] = 0;
graph[v][u] = 0;
visited = new boolean[n + 1];
int count1 = dfs(1, visited, graph);
int count2 = n - count1;
int diff = Math.abs(count1 - count2);
minDiff = Math.min(minDiff, diff);
graph[u][v] = 1;
graph[v][u] = 1;
}
return minDiff;
}
private int dfs(int node, boolean[] visited, int[][] graph) {
visited[node] = true;
int count = 1;
for (int i = 1; i < graph.length; i++) {
if (!visited[i] && graph[node][i] == 1) {
count += dfs(i, visited, graph);
}
}
return count;
}
}
λκΈλ¨κΈ°κΈ°