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

https://swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AWSHOpR6f_sDFARw 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ ์š”์•ฝ

N*Nํฌ๊ธฐ ์ง€๋„์—์„œ ๊ฒฌ์šฐ(0,0)๊ฐ€ ์ง๋…€(N-1,N-1)์—๊ฒŒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋ผ.

์ง€๋„์˜ ๊ฐ’์ด

0์ด๋ฉด ์ ˆ๋ฒฝ, 1์ด๋ฉด ๊ธธ, 1๋ณด๋‹ค ํฌ๋ฉด ๋‹ค๋ฆฌ์˜ ์‰ฌ๋Š”์‹œ๊ฐ„ ์ฃผ๊ธฐ์ด๋‹ค. ๋‹ค๋ฆฌ๋Š” ์‰ฌ๋Š”์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ๊ฑด๋„ ์ˆ˜ ์žˆ๋‹ค.

๋”ฑ ํ•œ ๋ฒˆ๋งŒ ๋‹ค๋ฆฌ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋” ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‹ค๋ฆฌ์˜ ์‰ฌ๋Š”์‹œ๊ฐ„ ์ฃผ๊ธฐ๋Š” M์ด๋‹ค.

 

2. ํ’€์ด

์ฒ˜์Œ์—” DFS๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค. ์ƒˆ๋กœ์šด ๋‹ค๋ฆฌ๋ฅผ ๋†“์•„๋ณด๊ณ  ์ง๋…€๋ฅผ ๋งŒ๋‚˜๋Ÿฌ ๊ฐ€๋Š”๋ฐ ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ๋Œ์•„์™€์„œ ๋‹ค๋ฅธ ์ž๋ฆฌ์— ๋‹ค๋ฆฌ๋ฅผ ๋†“์•„๋ณด๊ณ  ํ•  ์ƒ๊ฐ์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ๋”๋ผ. 20๊ฐœ ์ค‘์— 12๊ฐœ ๋งž์•˜๋‹ค.

์ตœ๋‹จ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ DFS๋ณด๋‹ค๋Š” BFS๊ฐ€ ์ ์ ˆํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค๋ฆฌ๋ฅผ ๋†“์•„๋ณด๋Š” ์ž‘์—…์€ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ์•„๋‹Œ๊ฐ€? -> ์ฒ˜์Œ์— ์ž…๋ ฅ๋ฐ›์„ ๋•Œ 0์ธ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€

for๋ฌธ์„ ๋Œ๋ ค์„œ ์ขŒํ‘œ๋งˆ๋‹ค ๋‹ค๋ฆฌ๋ฅผ ๋†“์•˜๋‹ค๊ณ  ์น˜๊ณ  bfs๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ ํ†ต๊ณผํ–ˆ๋‹ค.

๋‹ค๋ฆฌ๋ฅผ ๋†“์•˜๋‹ค๊ฐ€ ์น˜์› ๋‹ค๊ฐ€๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์ธ๋ฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฉด BFS?? ์ด๋Ÿฐ ํ‹€์— ๊ฐ‡ํžŒ ์ƒ๊ฐ ๋•Œ๋ฌธ์— ๊ฝค๋‚˜ ํ—ค๋งธ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋‹ค๋ฆฌ๋Š” ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์— ๋‘˜ ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ,

์ด ์กฐ๊ฑด ๋•Œ๋ฌธ์— 4๋ฐฉํƒ์ƒ‰์„ ํ•œ๋ฒˆ ๋” ํ•ด์ฃผ๋ฉด ๊ทธ๊ฑด ๋‚š์ธ ๊ฒƒ์ด๋‹ค.

์–ด์ฐจํ”ผ visited true๋ฉด ๋ฐฉ๋ฌธ์„ ์•ˆํ• ํ…Œ๊ณ , map[ny][nx]==0์ด๋ฉด continueํ• ๊ฒƒ์ด๋‹ˆ๊นŒ ๋ฌด์‹œํ•ด๋„ ๋˜๋Š” ์กฐ๊ฑด์ด๋‹ค.

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ

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

public class SW_4727_๊ฒฌ์šฐ์™€์ง๋…€ {

	static int N,M, ans;
	static int[][] map;
	static int[] dy= {-1,1,0,0};
	static int[] dx= {0,0,-1,1};
	
	static List<Pos> blank;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		
		for (int tc=1; tc<=T; tc++) {
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			
			map = new int[N][N];
			blank = new ArrayList<> ();
			for (int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j=0; j<N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
					if (map[i][j] == 0) {
						blank.add(new Pos(i, j)); //์ ˆ๋ฒฝ
					}
				}
			}//์ž…๋ ฅ ๋
			
			ans = Integer.MAX_VALUE;
			for (Pos node : blank) {
				map[node.y][node.x] = M;
				int res = bfs();
				map[node.y][node.x] = 0;
				

				//System.out.println(node.y+", "+node.x+" res:" + res);
				
				if (res==0) continue;
				else ans = Math.min(ans, res);
			}
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	static int bfs() {
		int res = 0;
		Queue<Pos> queue = new ArrayDeque<> ();
		boolean[][] visited = new boolean[N][N];
		
		queue.offer(new Pos(0,0,0));
		visited[0][0] = true;
		
		while (!queue.isEmpty()) {
			Pos cur = queue.poll();
			int y=cur.y;
			int x=cur.x;
			int sec=cur.sec;
			
			if (y==N-1 && x==N-1) {
				res = sec;
				break;
			}
			
			for (int d=0; d<4; d++) {
				int ny = y+dy[d];
				int nx = x+dx[d];
				if (ny<0 || ny>=N || nx<0||nx>=N || visited[ny][nx] == true) continue;
				
				if (map[ny][nx] == 0) continue;
				
				else if (map[ny][nx] == 1) {
					queue.offer(new Pos(ny,nx,sec+1));
					visited[ny][nx] = true;
				} 
				
				else if (map[ny][nx] > 1) {
					if (map[y][x] == 1) {
						if ((sec+1) % map[ny][nx] == 0) {
							queue.offer(new Pos(ny,nx,sec+1));
							visited[ny][nx] = true;
						} else {
							queue.offer(new Pos(y,x,sec+1));
						}
					}
				}
			}
		}
		return res;
	}
	
	static class Pos {
		int y,x,sec;
		boolean used;
		Pos(int y, int x) {
			this.y = y;
			this.x = x;
		}
		Pos(int y, int x, int sec) {
			this.y = y;
			this.x = x;
			this.sec = sec;
		}
	}
}

4. ์‚ฌ๋‹ด

์ž˜ํ•˜๊ณ ์žˆ๋Š”๊ฑฐ์˜€์œผ๋ฉด ์ข‹๊ฒ ๋‹ค ์–ธ์ œ์ฏค ์‹ค๋ ฅ์ด ๋Š˜๊นŒ