Publish:

νƒœκ·Έ: , , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

img_3.png

문제

문제 링크

img_3.png

img_3.png

μ„€λͺ…

졜초 κ·Έλž˜ν”„ κ°„μ„  정보가 주어지고, ν•΄λ‹Ή κ·Έλž˜ν”„μ—μ„œ 간선을 ν•˜λ‚˜μ”© λŠμ—ˆμ„ λ•Œ 두 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„μ–΄μ§€λŠ” κ·Έλž˜ν”„μ˜ λ…Έλ“œ 수 차이가 μ΅œμ†Œκ°€ λ˜λ„λ‘ ν•˜λŠ” 문제

풀이

μœ„ μ˜ˆμ‹œλ₯Ό 인접 ν–‰λ ¬ κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

img_3.png

  1. graph μ„ μ–Έ : 정점과 κ°„μ„  정보가 μ£Όμ–΄μ§€λ―€λ‘œ ν•΄λ‹Ή μ’Œν‘œλ₯Ό μ–‘λ°©ν–₯ μ—°κ²°ν•˜κΈ° μœ„ν•΄ int[][] 둜 graph λ₯Ό 선언해쀬닀. boolean[][] 둜 선언해도 상관없닀.

  2. graph μ„ΈνŒ… : μ–‘λ°©ν–₯ 연결을 μœ„ν•΄ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„ 초기 μ„ΈνŒ…μ„ μ§„ν–‰ν•œλ‹€.
    1
    2
    
    graph[wire[0]][wire[1]] = 1;
    graph[wire[1]][wire[0]] = 1;
    
  3. κ°„μ„  끊기 : λ‹€μŒκ³Ό 같이 간선을 ν•˜λ‚˜μ”© λŠμ—ˆμ„ λ•Œμ˜ λ…Έλ“œ 수λ₯Ό μ„Όλ‹€.
    1
    2
    3
    4
    5
    
    // 간선을 끊고
    graph[u][v] = 0;
    graph[v][u] = 0;
    // κ·Έ κ·Έλž˜ν”„λ₯Ό dfs λŒλ¦°λ‹€. λ¬Έμ œμ—μ„œ n 은 μžμ—°μˆ˜λΌκ³  ν–ˆμœΌλ―€λ‘œ graph λŠ” 1λΆ€ν„° μ„ΈνŒ…λ˜μ–΄ μžˆλ‹€.
    dfs(1, visited, graph);
    
  4. λ…Έλ“œ 수 차이가 μ΅œμ†Œκ°€ λ˜λŠ” κ°’ μ°ΎκΈ° : dfs μ—μ„œ 찾은 ν•œ κ·Έλž˜ν”„μ˜ λ…Έλ“œ μˆ˜κ°€ count 라면, λ‚˜λ¨Έμ§€ κ·Έλž˜ν”„μ˜ λ…Έλ“œ μˆ˜λŠ” n - count κ°€ λœλ‹€. 이 두 수의 차이λ₯Ό κ΅¬ν•˜κ³  기쑴의 μ΅œμ†Œκ°’ 보닀 μž‘μ€ 경우 minDiff λ₯Ό κ°±μ‹ ν•΄ λ‚˜κ°„λ‹€.
  5. κ°„μ„  볡ꡬ : λŠμ—ˆλ˜ 간선을 λ‹€μ‹œ μ—°κ²°μ‹œμΌœ μ£Όκ³ , λ‹€μŒ 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;
  }
}
λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°