01-10 04:27
Recent Posts
Recent Comments
관리 메뉴

miinsun

[BAEKJOON] λ°±μ€€ κ·Έλž˜ν”„ 2178 :: 미둜 탐색 λ³Έλ¬Έ

Algorithm/Baekjoon

[BAEKJOON] λ°±μ€€ κ·Έλž˜ν”„ 2178 :: 미둜 탐색

miinsun 2022. 4. 3. 00:55

 

πŸ’¬  문제 μ„€λͺ…

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

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

 

πŸ”¨  μž…μΆœλ ₯ 예

μž…λ ₯ 

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

 

좜λ ₯

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

 

예제 μž…λ ₯ 1)

4 6
101111
101010
101011
111011

 

예제 좜λ ₯ 1)

15

 

예제 μž…λ ₯ 2)

4 6
110110
110110
111111
111101

 

예제 좜λ ₯ 2)

9

​

예제 μž…λ ₯ 3)

2 25
1011101110111011101110111
1110111011101110111011101

 

예제 좜λ ₯ 3)

38

​

예제 μž…λ ₯ 4)

7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111

 

예제 좜λ ₯ 4)

13

​

 

πŸ’»  Main.java

  • DFS와 BFS λͺ¨λ‘ μ‚¬μš©κ°€λŠ₯ν•˜μ§€λ§Œ, DFSλ₯Ό μ΄μš©ν•΄ ν’€λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λœ¬λ‹€.
  • λ‚˜λŠ” DFS둜 ν’€λ‹€κ°€ μ‹œκ°„μ΄ˆκ³Όκ°€ λ– μ„œ BFS둜 λ‹€μ‹œ ν•œλ²ˆ 풀어쀬닀.

BFS_ver

/* λ°±μ€€ κ·Έλž˜ν”„ - 2178 :: 미둜 탑색 - BFS*/

import java.util.*;
import java.io.*;

class Point { 
	public int x, y; 
	Point (int x, int y){ 
		this.x = x; 
		this.y = y; 
	} 
}
	
public class Main {
	static int[][] board, dis;
	static int n, m;
	// μΈμ ‘ν•œ μΉΈ(쒌우 μœ„ μ•„λž˜) μ’Œν‘œ 정보
	static int[] dx = {-1, 0, 1, 0}; 
	static int[] dy = {0, 1, 0, -1};

	static public void BFS(int x, int y) { 
		Queue<Point> Q = new LinkedList<>();
		Q.offer(new Point(x, y)); 
		board[x][y] = 1; 
		
        //큐가 λ‹€ λ–¨μ–΄μ§ˆλ•ŒκΉŒμ§€ 반볡
		while(!Q.isEmpty()) { 
			Point tmp = Q.poll(); 
			for(int i = 0; i < 4; i++) { 
				int nx = tmp.x + dx[i]; 
				int ny = tmp.y + dy[i]; 
				
				// 경계선 검사 
				if(nx >= 0 && nx <= n - 1 && ny >= 0 && ny <= m - 1 && board[nx][ny] == 1) {
					board[nx][ny] = 0; 
					Q.offer(new Point(nx, ny));
                    // μ›λž˜ κ±°λ¦¬μ—μ„œ + 1
					dis[nx][ny] = dis[tmp.x][tmp.y] + 1; 
				}
			}
		}
	}

		
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		board = new int[n][m];
		dis = new int[n][m];
		
		for(int i = 0; i < n; i++) {
			char[] cList = br.readLine().toCharArray();
			for(int j = 0; j < m; j++) {
				board[i][j] = cList[j] - '0';
			}
		}
		
		BFS(0, 0);
		System.out.println(dis[n-1][m-1] + 1);
		
		br.close();
		return ;
	}
}

 

DFS_ver

/* λ°±μ€€ κ·Έλž˜ν”„ - 2178 :: 미둜 탑색 - DFS */

import java.util.*;
import java.io.*;

public class Main {
	static int[][] board;
	static int cnt = 1;
	static int min = Integer.MAX_VALUE;
	
	// μΈμ ‘ν•œ μΉΈ(쒌우 μœ„ μ•„λž˜) μ’Œν‘œ 정보
	static int[] dx = {-1, 0, 1, 0};
	static int[] dy = {0, 1, 0, -1};
	
	static void DFS(int x, int y, int n, int m) {
		if(x == n - 1 && y == m - 1)
			min = Math.min(min, cnt);
		else {
			for(int i = 0; i < 4; i++) { 
				// λ‹€μŒμ— 올 μ’Œν‘œ
				int nx = x + dx[i]; 
				int ny = y + dy[i]; 
				
				// μ§€ν‘œ 경계 κ°’ 검사
				if(nx >= 0 && ny >= 0 && nx < n && ny < m && board[nx][ny] == 1) { 
					cnt++;
					board[nx][ny] = 0;
					DFS(nx, ny, n, m); 
					cnt--;
					board[nx][ny] = 1;
				}
			}
		}
	}
		
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		board = new int[n][m];
		
		for(int i = 0; i < n; i++) {
			char[] cList = br.readLine().toCharArray();
			for(int j = 0; j < m; j++) {
				board[i][j] = cList[j] - '0';
			}
		}
		
		DFS(0, 0, n, m);
		System.out.println(min);
		
		br.close();
		return ;
	}
}
Comments