λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸš€ Algorithm/BOJ

[λ°±μ€€] 2178 미둜 탐색(JAVA)

πŸ’‘ 문제 


N×M크기의 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λŠ” λ―Έλ‘œκ°€ μžˆλ‹€.

 

λ―Έλ‘œμ—μ„œ 1은 이동할 수 μžˆλŠ” 칸을 λ‚˜νƒ€λ‚΄κ³ , 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ―Έλ‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N, M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. ν•œ μΉΈμ—μ„œ λ‹€λ₯Έ 칸으둜 이동할 λ•Œ, μ„œλ‘œ μΈμ ‘ν•œ 칸으둜만 이동할 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 15칸을 μ§€λ‚˜μ•Ό (N, M)의 μœ„μΉ˜λ‘œ 이동할 수 μžˆλ‹€. 칸을 μ…€ λ•Œμ—λŠ” μ‹œμž‘ μœ„μΉ˜μ™€ 도착 μœ„μΉ˜λ„ ν¬ν•¨ν•œλ‹€.

 

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N, M(2 ≤ N, M ≤ 100)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” M개의 μ •μˆ˜λ‘œ λ―Έλ‘œκ°€ μ£Όμ–΄μ§„λ‹€. 각각의 μˆ˜λ“€μ€ λΆ™μ–΄μ„œ μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

 

좜λ ₯

첫째 쀄에 μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€. 항상 λ„μ°©μœ„μΉ˜λ‘œ 이동할 수 μžˆλŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

 

 

 

ν•΄κ²° 방법:

이 λ¬Έμ œλŠ” DFS와 BFS μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ ν’€ 수 μžˆλ‹€. DFS μ•Œκ³ λ¦¬μ¦˜μ€ μ΅œλ‹¨κ±°λ¦¬λ₯Ό 찾으렀면 μ™„μ „ 탐색을 ν•˜κ³  κ·Έμ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 값을 선택해야 ν•˜λŠ”λ° κ²½λ‘œκ°€ μ•„μ£Ό λ§Žμ„ 수 μžˆμœΌλ―€λ‘œ μ‹œκ°„ λ³΅μž‘λ„κ°€ 맀우 컀진닀. 반면 BFSλŠ” μ΅œλ‹¨κ±°λ¦¬λ₯Ό 보μž₯ν•˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ λ¬Έμ œλ“€ (μ΅œλ‹¨κ±°λ¦¬ κ΅¬ν•˜κΈ°)은 BFS둜 ν‘ΈλŠ” 것이 μ’‹λ‹€.

 

이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” 미둜의 각 칸을 μ •μ μœΌλ‘œ μƒκ°ν•˜κ³  각 μΉΈ μ‚¬μ΄μ˜ 연결관계λ₯Ό κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚΄μ•Ό ν•œλ‹€. κ·Έ λ‹€μŒ BFS μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ μ‹œμž‘μ μ—μ„œλΆ€ν„° λ„μ°©μ κΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•˜λ©΄ λœλ‹€.

λ¨Όμ € 미둜의 정보λ₯Ό μž…λ ₯λ°›μ•„μ„œ 2차원 배열에 μ €μž₯ν•œλ‹€. BFSλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ ν˜„μž¬κΉŒμ§€ μ΄λ™ν•œ μΉΈ 수λ₯Ό μ €μž₯ν•œλ‹€. μ‹œμž‘μ μ—μ„œλΆ€ν„° BFSλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ 도착점에 도달할 λ•ŒκΉŒμ§€ μ΄λ™ν•œ μΉΈ 수λ₯Ό μ €μž₯ν•˜λ©΄ λ˜λŠ”λ°, 이 λ•Œ 도착점에 λ„λ‹¬ν–ˆμ„ λ•Œμ˜ μ΄λ™ν•œ μΉΈ μˆ˜κ°€ μ΅œμ†Œκ°’μ΄ λœλ‹€.

 

 

μ•Œκ³ λ¦¬μ¦˜:

BFS

 

μ‹œκ°„λ³΅μž‘λ„:

O(NM)

 

 

μ½”λ“œ μ‹€ν–‰ μˆœμ„œ:

  1. μž…λ ₯κ°’μœΌλ‘œ 받은 미둜λ₯Ό 2차원 λ°°μ—΄λ‘œ μ €μž₯
  2. μ‹œμž‘μ  (0, 0)μ—μ„œ BFS μ•Œκ³ λ¦¬μ¦˜μ„ μ‹œμž‘
  3. 큐에 μ‹œμž‘μ μ„ λ„£κ³  λ°©λ¬Έν–ˆμŒμ„ ν‘œμ‹œ
  4. 큐가 빌 λ•ŒκΉŒμ§€ λ‹€μŒμ„ 반볡
    1. νμ—μ„œ 정점을 ν•˜λ‚˜ κΊΌλ‚Έλ‹€.
    2. κΊΌλ‚Έ μ •μ μ—μ„œ 갈 수 μžˆλŠ” λͺ¨λ“  정점을 큐에 λ„£κ³  λ°©λ¬Έν–ˆμŒμ„ ν‘œμ‹œ
    3. μ΄λ•Œ, 각 μ •μ κΉŒμ§€μ˜ 거리λ₯Ό 이전 μ •μ κΉŒμ§€μ˜ 거리 + 1둜 계산
  5. 도착점 (n-1, m-1)κΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬ 좜λ ₯

 

 

πŸ’­ 리뷰

미둜λ₯Ό 2차원 λ°°μ—΄λ‘œ λ°›μ•„μ„œ 각 칸을 μ •μ μœΌλ‘œ μƒκ°ν•˜κ³  각 μΉΈ μ‚¬μ΄μ˜ 연결관계λ₯Ό κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚΄λ €κ³  λ…Έλ ₯ν–ˆλ‹€. κ·Έ λ‹€μŒ BFS μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ μ‹œμž‘μ μ—μ„œλΆ€ν„° λ„μ°©μ κΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•˜λŠ” 게 μ‹œκ°„μ΄ κ±Έλ Έλ‹€.

 

 

 

πŸ– λ‚΄ λ‹΅μ•ˆ


import java.util.*;

public class boj2178 { // 미둜 탐색 싀버1
    static int n, m;
    static int[][] maze; // 미둜의 정보λ₯Ό μ €μž₯ν•˜λŠ” 2차원 λ°°μ—΄
    static boolean[][] visited; // λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ €μž₯ν•˜λŠ” 2차원 λ°°μ—΄
    static int[] dx = {-1, 0, 1, 0}; // 상, 우, ν•˜, 쒌 μˆœμ„œλ‘œ μ΄λ™ν•˜κΈ° μœ„ν•œ λ°°μ—΄
    static int[] dy = {0, 1, 0, -1};

    public static void bfs(int x, int y) {
        Queue<int[]> q = new LinkedList<>(); // BFSλ₯Ό μœ„ν•œ 큐
        q.offer(new int[]{x, y}); // μ‹œμž‘μ μ„ 큐에 μΆ”κ°€
        visited[x][y] = true; // μ‹œμž‘μ  λ°©λ¬Έ 처리
        while (!q.isEmpty()) { // 큐가 λΉ„μ–΄μžˆμ§€ μ•Šμ€ λ™μ•ˆ 반볡
            int[] point = q.poll(); // νμ—μ„œ 점 ν•˜λ‚˜λ₯Ό κΊΌλ‚΄μ„œ
            for (int i = 0; i < 4; i++) { // 상, 우, ν•˜, 쒌 μˆœμ„œλ‘œ 이동할 수 μžˆλŠ”μ§€ 확인
                int nx = point[0] + dx[i]; // μ΄λ™ν•œ μœ„μΉ˜μ˜ x μ’Œν‘œ
                int ny = point[1] + dy[i]; // μ΄λ™ν•œ μœ„μΉ˜μ˜ y μ’Œν‘œ
                if (nx < 0 || nx >= n || ny < 0 || ny >= m) { // 미둜λ₯Ό λ²—μ–΄λ‚œ 경우
                    continue; // λ‹€μŒ 이동 λ°©ν–₯ 확인
                }
                if (maze[nx][ny] == 0) { // 이동할 수 μ—†λŠ” 경우 (벽인 경우)
                    continue; // λ‹€μŒ 이동 λ°©ν–₯ 확인
                }
                if (!visited[nx][ny]) { // λ°©λ¬Έν•˜μ§€ μ•Šμ€ 경우
                    visited[nx][ny] = true; // 방문 처리
                    maze[nx][ny] = maze[point[0]][point[1]] + 1; // ν˜„μž¬κΉŒμ§€ μ΄λ™ν•œ μΉΈ 수λ₯Ό μ €μž₯
                    q.offer(new int[]{nx, ny}); // 큐에 μΆ”κ°€
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt(); // 미둜의 μ„Έλ‘œ 길이
        m = sc.nextInt(); // 미둜의 κ°€λ‘œ 길이
        maze = new int[n][m]; // 미둜 정보λ₯Ό μ €μž₯ν•  λ°°μ—΄ μ΄ˆκΈ°ν™”
        visited = new boolean[n][m]; // λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ €μž₯ν•  λ°°μ—΄ μ΄ˆκΈ°ν™”
        for (int i = 0; i < n; i++) { // 미둜 정보 μž…λ ₯ λ°›κΈ°
            String row = sc.next(); // ν•œ 쀄씩 μž…λ ₯ λ°›μŒ
            for (int j = 0; j < m; j++) { // 각 칸에 λŒ€ν•΄
                maze[i][j] = row.charAt(j) - '0'; // λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•˜μ—¬ 미둜 배열에 μ €μž₯
            }
        }
        bfs(0, 0); // μ‹œμž‘μ  (0, 0)μ—μ„œ BFS μ‹œμž‘
        System.out.println(maze[n - 1][m - 1]); // 도착
    }
}

 

 

 

 

'πŸš€ Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€] μš”μ„Έν‘ΈμŠ€ 문제 0 (JAVA)  (0) 2023.04.11
[λ°±μ€€] 2828 사과 λ‹΄κΈ° κ²Œμž„(JAVA)  (0) 2023.04.02
[λ°±μ€€] 1926 κ·Έλ¦Ό(JAVA)  (0) 2023.03.21
8958  (0) 2021.08.18
1110  (0) 2021.08.16