Publish:

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

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

img_3.png

문제

문제 링크

img_3.png

μ„€λͺ…

img

μœ„ 그림처럼 β€œR” μ—μ„œ μΆœλ°œν•΄ μƒν•˜μ’Œμš°λ‘œ 움직일 수 μžˆλŠ”λ° μ΄μ „κΉŒμ§€ ν’€μ–΄λ΄€λ˜ BFS/DFS λ¬Έμ œμ™€ λ‹€λ₯Έμ μ€ ν•œ μΉΈμ”© μ›€μ§μ΄λ©΄μ„œ μƒν•˜μ’Œμš°λ₯Ό νƒμƒ‰ν•΄κ°€λŠ” 방식이 μ•„λ‹ˆλΌ

  • β€œD” λ₯Ό λ§Œλ‚ λ•Œ κΉŒμ§€ μ›€μ§μ΄κ±°λ‚˜
  • 격자의 끝 뢀뢄을 λ§Œλ‚ λ•Œ κΉŒμ§€ 움직인닀.

μ˜ˆμ‹œμ˜ 경우 λΉ¨κ°„ ν™”μ‚΄ν‘œ λŒ€λ‘œ 총 7번 움직이면 β€œR” μ—μ„œ β€œG” κΉŒμ§€ 갈 수 μžˆλŠ” μ΅œλ‹¨ κ²½λ‘œκ°€ λœλ‹€.

풀이

μ΄μ „κΉŒμ§€μ˜ λ¬Έμ œλŠ” 주둜 DFS 둜 ν’€μ—ˆλŠ”λ° 이번 λ¬Έμ œλŠ” BFS 둜 ν‘ΈλŠ” 것이 더 μ μ ˆν•˜λ‹€. DFS 둜 ν‘ΈλŠ” 경우 μ΅œλ‹¨ κ²½λ‘œμΈμ§€ ν™•μΈν•˜λŠ” 둜직이 μΆ”κ°€λ‘œ ν•„μš”ν•˜λ‹€.

탐색을 μ‹œμž‘ν•  β€œR” 의 μœ„μΉ˜λ₯Ό 찾은 ν›„ BFS λ₯Ό μ‹œμž‘ν•œλ‹€. bfs ν•¨μˆ˜μ—μ„œλŠ” β€œR” μ—μ„œ μΆœλ°œν•΄ β€œG” 에 도달할 λ•Œ κΉŒμ§€μ˜ 정점 κ°„μ˜ 거리λ₯Ό ꡬ해주면 λœλ‹€. 정점 κ°„μ˜ 거리λ₯Ό ꡬ할 땐 dist λ³€μˆ˜λ₯Ό dfs ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬ν•˜κ±°λ‚˜ bfs 의 경우 queue 에 λ„£μ–΄μ£ΌλŠ” μ‹μœΌλ‘œ κ΅¬ν•˜λ©΄ λœλ‹€.

μž₯애물을 λ§Œλ‚˜κ±°λ‚˜ 벽에 λ„λ‹¬ν• λ•Œ κΉŒμ§€ μ­‰ μ΄λ™ν•œ ν›„, κ·Έ λ…Έλ“œκ°€ 아직 λ°©λ¬Έ 전이라면 방문처리λ₯Ό ν•΄μ£Όκ³  λ‹€μŒ 탐색을 μœ„ν•΄ queue 에 μ’Œν‘œλ₯Ό λ„£μ–΄μ€€λ‹€. μ΄λ•Œ, dist + 1 을 λ„˜κ²¨μ€˜μ„œ λ…Έλ“œ κ°„ 이동 거리λ₯Ό 계산해 μ€€λ‹€.

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
61
62
63
64
65
66
class Solution {
  static String[][] graph;
  static boolean[][] visited;
  static int[] dx = {-1, 1, 0, 0};
  static int[] dy = {0, 0, -1, 1};
  static int n;

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

    int x = 0, y = 0;
    for (int i = 0; i < n; i++) {
      graph[i] = new String[board[i].length()];
      visited[i] = new boolean[board[i].length()];
      char[] charArray = board[i].toCharArray();
      for (int j = 0; j < charArray.length; j++) {
        String s = String.valueOf(charArray[j]);
        graph[i][j] = s;
        if (s.equals("R")) {
          x = i;
          y = j;
        }
      }
    }
    return bfs(x, y);
  }

  private int bfs(int x, int y) {
    Queue<int[]> queue = new LinkedList<>();
    queue.add(new int[] {x, y, 0});
    visited[x][y] = true;

    while (!queue.isEmpty()) {
      int[] current = queue.poll();
      int cx = current[0];
      int cy = current[1];
      int dist = current[2];

      if (graph[cx][cy].equals("G")) {
        return dist;
      }

      for (int i = 0; i < 4; i++) {
        int nx = cx;
        int ny = cy;

        while (isInRange(nx + dx[i], ny + dy[i]) && !graph[nx + dx[i]][ny + dy[i]].equals("D")) {
          nx += dx[i];
          ny += dy[i];
        }

        if (!visited[nx][ny]) {
          visited[nx][ny] = true;
          queue.add(new int[] {nx, ny, dist + 1});
        }
      }
    }
    return -1;
  }

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

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