Publish:

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

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

img_3.png

문제

문제 링크

img_3.png

μž…μΆœλ ₯ 예

img_4.png

μ„€λͺ…

지도 정보가 λ°°μ—΄λ‘œ μ£Όμ–΄μ§€λŠ”λ°, 각 μ˜μ—­μ—” μˆ«μžκ°€ μ ν˜€μžˆκ±°λ‚˜, β€œX” ν‘œμ‹œκ°€ μžˆλ‹€. νƒμƒ‰ν•˜λŠ” μ˜μ—­μ˜ 숫자λ₯Ό ν•©μΉœ 배열을 λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

풀이

κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점이 μ£Όμ–΄μ§€λ―€λ‘œ, 이λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ κ·Έλž˜ν”„λ₯Ό 2차원 λ°°μ—΄λ‘œ μ„ μ–Έν•œλ‹€. κ·Έ ν›„ λ°°μ—΄μ˜ 첫번째 μΈλ±μŠ€λΆ€ν„° μƒν•˜μ’Œμš° λͺ¨λ“  방면으둜 νƒμƒ‰ν•΄κ°€λ©΄μ„œ κ·Έ 정점에 적힌 수λ₯Ό ν•©μΉœ 배열을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. κ·Έλž˜ν”„μ—μ„œ 각 정점에 적힌 μˆ˜λŠ” graph[x][y] 둜 μ•Œ 수 μžˆλ‹€. dfs μ‹œμž‘ 정점뢀터 νƒμƒ‰ν• λ•Œλ§ˆλ‹€ 이 값을 λˆ„μ ν•œ 값을 λ°˜ν™˜ν•˜κ³ , list 에 μ €μž₯ν•œλ‹€. μ˜€λ¦„μ°¨μˆœ μ •λ ¬ ν›„ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

전체 μ½”λ“œ 쀑 제일 핡심적인 μ½”λ“œλŠ” size += dfs(nx, ny) 이 μ½”λ“œλΌκ³  ν•  수 μžˆλ‹€.

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
class Solution {
  static String[][] graph;
  static boolean[][] visited;
  static int n;
  static int[] dx = {-1, 1, 0, 0};
  static int[] dy = {0, 0, -1, 1};
  static ArrayList<Integer> answer = new ArrayList<>();

  public int[] solution(String[] maps) {
    n = maps.length;
    graph = new String[n][];
    visited = new boolean[n][];

    for (int i = 0; i < n; i++) {
      graph[i] = new String[maps[i].length()];
      visited[i] = new boolean[maps[i].length()];
      char[] charArray = maps[i].toCharArray();
      for (int j = 0; j < charArray.length; j++) {
        graph[i][j] = String.valueOf(charArray[j]);
      }
    }

    for (int x = 0; x < n; x++) {
      for (int y = 0; y < graph[x].length; y++) {
        if (!visited[x][y] && !graph[x][y].equals("X")) {
          answer.add(dfs(x, y));
        }
      }
    }

    if (answer.isEmpty()) {
      return new int[] {-1};
    }

    return answer.stream().mapToInt(Integer::intValue).sorted().toArray();
  }

  private static int dfs(int x, int y) {
    visited[x][y] = true;
    int size = Integer.parseInt(graph[x][y]);

    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];

      if (isInRange(nx, ny) && !visited[nx][ny] && !graph[nx][ny].equals("X")) {
        size += dfs(nx, ny);
      }
    }
    return size;
  }

  private static boolean isInRange(int x, int y) {
    return x >= 0 && x < n && y >= 0 && y < graph[x].length;
  }
}
λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

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