๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 2์ฃผ์ฐจ] 1261 ์•Œ๊ณ ์ŠคํŒŸ ๊ณจ๋“œ 4 - ์ž๋ฐ”(Java) / BFS, ๋‹ค์ต์ŠคํŠธ๋ผ

๐Ÿ“‘ ๋ฌธ์ œ

https://www.acmicpc.net/problem/1261

 

1261๋ฒˆ: ์•Œ๊ณ ์ŠคํŒŸ

์ฒซ์งธ ์ค„์— ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€๋กœ ํฌ๊ธฐ M, ์„ธ๋กœ ํฌ๊ธฐ N (1 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฏธ๋กœ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž 0๊ณผ 1์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ๋ฐฉ์„ ์˜๋ฏธํ•˜๊ณ , 1์€ ๋ฒฝ์„ ์˜๋ฏธ

www.acmicpc.net

๋”๋ณด๊ธฐ

๋ฌธ์ œ

์•Œ๊ณ ์ŠคํŒŸ ์šด์˜์ง„์ด ๋ชจ๋‘ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜”๋‹ค. ๋ฏธ๋กœ๋Š” N*M ํฌ๊ธฐ์ด๋ฉฐ, ์ด 1*1ํฌ๊ธฐ์˜ ๋ฐฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” ๋นˆ ๋ฐฉ ๋˜๋Š” ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋นˆ ๋ฐฉ์€ ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋‹ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฒฝ์€ ๋ถ€์ˆ˜์ง€ ์•Š์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

์•Œ๊ณ ์ŠคํŒŸ ์šด์˜์ง„์€ ์—ฌ๋Ÿฌ๋ช…์ด์ง€๋งŒ, ํ•ญ์ƒ ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฉ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ๋ช…์ด ๋‹ค๋ฅธ ๋ฐฉ์— ์žˆ์„ ์ˆ˜๋Š” ์—†๋‹ค. ์–ด๋–ค ๋ฐฉ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ๋ฐฉ์ด๋‹ค. ์ฆ‰, ํ˜„์žฌ ์šด์˜์ง„์ด (x, y)์— ์žˆ์„ ๋•Œ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์€ (x+1, y), (x, y+1), (x-1, y), (x, y-1) ์ด๋‹ค. ๋‹จ, ๋ฏธ๋กœ์˜ ๋ฐ–์œผ๋กœ ์ด๋™ ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

๋ฒฝ์€ ํ‰์†Œ์—๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์•Œ๊ณ ์ŠคํŒŸ์˜ ๋ฌด๊ธฐ AOJ๋ฅผ ์ด์šฉํ•ด ๋ฒฝ์„ ๋ถ€์ˆ˜์–ด ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ฒฝ์„ ๋ถ€์ˆ˜๋ฉด, ๋นˆ ๋ฐฉ๊ณผ ๋™์ผํ•œ ๋ฐฉ์œผ๋กœ ๋ณ€ํ•œ๋‹ค.

๋งŒ์•ฝ ์ด ๋ฌธ์ œ๊ฐ€ ์•Œ๊ณ ์ŠคํŒŸ์— ์žˆ๋‹ค๋ฉด, ์šด์˜์ง„๋“ค์€ ๊ถ๊ทน์˜ ๋ฌด๊ธฐ sudo๋ฅผ ์ด์šฉํ•ด ๋ฒฝ์„ ํ•œ ๋ฒˆ์— ๋‹ค ์—†์• ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด ๋ฌธ์ œ๋Š” Baekjoon Online Judge์— ์ˆ˜๋ก๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, sudo๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

ํ˜„์žฌ (1, 1)์— ์žˆ๋Š” ์•Œ๊ณ ์ŠคํŒŸ ์šด์˜์ง„์ด (N, M)์œผ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ๋ฒฝ์„ ์ตœ์†Œ ๋ช‡ ๊ฐœ ๋ถ€์ˆ˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€๋กœ ํฌ๊ธฐ M, ์„ธ๋กœ ํฌ๊ธฐ N (1 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฏธ๋กœ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž 0๊ณผ 1์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ๋ฐฉ์„ ์˜๋ฏธํ•˜๊ณ , 1์€ ๋ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค.

(1, 1)๊ณผ (N, M)์€ ํ•ญ์ƒ ๋šซ๋ ค์žˆ๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์•Œ๊ณ ์ŠคํŒŸ ์šด์˜์ง„์ด (N, M)์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒฝ์„ ์ตœ์†Œ ๋ช‡ ๊ฐœ ๋ถ€์ˆ˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

๐Ÿ’ก BFS ์ฝ”๋“œ์—์„œ ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ตœ์†Œ ๊ฐ€์ค‘์น˜๋ฅผ ์ฐพ์•„ ๊ฐ€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ๊ฐœ๋…์ด ๋œ๋‹ค.

 

 โ—ป๏ธ ์šฐ์„ ์ˆœ์œ„ํ์— ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ ๋ฐฐ์—ด์„ ๋“ค๊ณ  BFS ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

 โ—ป๏ธ "๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜"๊ฐ€ ์ตœ์†Œ์ธ ์œ„์น˜๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰์„ ํ•œ๋‹ค. 

 โ—ป๏ธ ์ƒˆ๋กœ์šด ์œ„์น˜์— ๋ฒฝ์ด ์žˆ์œผ๋ฉด ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜๋ฅผ +1 ํ•ด์ฃผ๊ณ , ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋งŒ ํ•ด์„œ ๋‹ค์‹œ ํ์— ๋„ฃ๋Š”๋‹ค.

 โ—ป๏ธ ๋ชฉํ‘œ ์œ„์น˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค. (๋ฒฝ์„ ์ตœ์†Œ๋กœ ๋ถ€์ˆœ ํšŸ์ˆ˜๋กœ ๋ฐœ๊ฒฌ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ)

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

/** https://www.acmicpc.net/problem/1261 */
// ๋‹ค์ต์ŠคํŠธ๋ผ, BFS
// ๋ฒฝ์„ ์ตœ์†Œ๋กœ ๋ถ€์ˆ˜๋ฉฐ ์ด๋™ -> ๋‹ค์ต์ŠคํŠธ๋ผ์—์„œ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ(๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜)๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ
public class Main_๋ฐฑ์ค€_1261_์•Œ๊ณ ์ŠคํŒŸ_๊ณจ๋“œ4 {

	static int N, M, result;
	static int[][] map;
	static boolean[][] visited;
	
	static int[] dr = {1,-1,0,0};
	static int[] dc = {0,0,1,-1};
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		M = Integer.parseInt(st.nextToken());//๊ฐ€๋กœ
		N = Integer.parseInt(st.nextToken());//์„ธ๋กœ
		map = new int[N+1][M+1];
		visited = new boolean[N+1][M+1];
		
		for (int i = 1; i <= N; i++) {
			String str = br.readLine();
			for (int j = 1; j <= M; j++) {
				map[i][j] = str.charAt(j-1) - '0';
			}
		}//input
		
		bfs();
		System.out.println(result);
	}//end of main
	
	private static void bfs() {
		
		visited[1][1] = true;
		// ๋ฒฝ์„ ๋ถ€์ˆœ ํšŸ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ํ ์„ค์ •
		PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->(a[2]-b[2]));
		queue.offer(new int[] {1,1,0});//(r,c,d)
		int r, c, d, nr, nc, nd;
		
		while(queue.size()>0) {
			int[] cur = queue.poll();
			r = cur[0];
			c = cur[1];
			d = cur[2];
			
			if(r==N && c==M) {
				result = d;
				break;
			}
			
			for (int i = 0; i < 4; i++) {
				nr = r + dr[i];
				nc = c + dc[i];
				nd = d;
				
				if(nr>N||nc>M||nr<1||nc<1||visited[nr][nc]) continue;
				
				if(map[nr][nc]==1) nd++;
				
				visited[nr][nc] = true;
				queue.offer(new int[] {nr,nc,nd});
			}
		}
	}//end of bfs
	
}//end of class

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ