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

์•Œ๊ณ ๋ฆฌ์ฆ˜/์ •์˜ฌ

[์ •์˜ฌ] 1113๋ฒˆ 119๊ตฌ๊ธ‰๋Œ€ - ์ž๋ฐ”(JAVA) / ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„๊ฐ€๋Š” BFS

๐Ÿ“‘ ๋ฌธ์ œ

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=393&sca=99&sfl=wr_subject&stx=119%EA%B5%AC%EA%B8%89%EB%8C%80 

 

JUNGOL

 

www.jungol.co.kr

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

์ฒ ์ˆ˜๋„ค ๋™๋„ค์˜ ์†Œ๋ฐฉ์„œ์—์„œ๋Š” ์ฃผ๋ฏผ๋“ค์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด 119 ๊ตฌ๊ธ‰ ๋Œ€๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ€๋” ์ผ์–ด๋‚˜๋Š” ์ผ์ด์ง€๋งŒ ์œ„๊ธ‰ํ•œ ์ผ์€ ๋ถ„์ดˆ๋ฅผ ๋‹คํˆฌ๋Š” ์ผ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— 119 ๊ตฌ๊ธ‰๋Œ€๊ฐ€ ์œ„๊ธ‰ํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋„์ฐฉํ•ด์•ผ ํ•œ๋‹ค.

 

119 ๊ตฌ๊ธ‰์ฐจ๋Š” ์„ฑ๋Šฅ์ด ์ข‹์•„ ์ผ๋ฐ˜ ์ž๋™์ฐจ๋ณด๋‹ค ์•„์ฃผ ๋น ๋ฅธ ์†๋„๋กœ ์ฃผํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋„ˆ๋ฅผ ๋Œ ๋•Œ์—๋Š” ์ผ๋ฐ˜ ์ž๋™์ฐจ์ฒ˜๋Ÿผ ์†๋„๋ฅผ ์™„์ „ํžˆ ์ค„์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชฉํ‘œ์ง€์ ์— ๋„๋‹ฌํ•  ๋•Œ ๊นŒ์ง€ ๋˜๋„๋ก ์ฝ”๋„ˆ๋ฅผ ๋Œ์ง€ ์•Š๊ณ  ์ง์„  ๋„๋กœ๋ฅผ ํ†ตํ•ด ๋„์ฐฉํ•ด์•ผ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์œ„์˜ ํ…Œ์ด๋ธ”์€ 119 ๊ตฌ๊ธ‰ ๋Œ€์—์„œ ์œ„๊ธ‰ํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€์˜ ์ง€๋„๋ฅผ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค. ํฐ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์ด ์ฐจ๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ํšŒ์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ๋Š” ๊ณณ์ด ์žฅ์• ๋ฌผ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด์ œ ์†Œ๋ฐฉ์„œ์—์„œ ์œ„๊ธ‰ํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€ ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ณด์ž. (์ถœ๋ฐœ์ ์€ ํ•ญ์ƒ ์™ผ์ชฝ ๋งจ ์œ„(0,0)์ด๊ณ  ๋„์ฐฉ์ ์€ ์ขŒํ‘œ๋กœ ์ฃผ์–ด์ง„๋‹ค. 119 ๊ตฌ๊ธ‰์ฐจ๋Š” ๊ฐ€๋กœ์™€ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ  ๋Œ€๊ฐ์„ ์œผ๋กœ๋Š” ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค.)

 

์ž…๋ ฅํ˜•์‹

์ฒซ์งธ ์ค„์— ์ง€๋„์˜ ํฌ๊ธฐ M(1≤M≤100)×N(1≤N≤100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ชฉํ‘œ์  m,n์ด ์ฃผ์–ด์ง„๋‹ค. (๋‹จ M=m+1, N=n+1) ๋‹ค์Œ N์ค„์—๋Š” M๊ฐœ์˜ ๊ฐ’์ด ์ฃผ์–ด์ง€๋ฉฐ ๊ฐ ๊ฐ’์—์„œ 1์€ ๋„๋กœ์ด๊ณ  0์€ ์ง„์ž…ํ•  ์ˆ˜ ์—†๋Š” ๋ฌผ๊ฑด์ด ๋†“์—ฌ ์žˆ๋‹ค.

 

์ถœ๋ ฅํ˜•์‹

์ฒซ์งธ ์ค„์— ์ตœ์†Œ ์ฝ”๋„ˆ๋ฅผ ๋„๋Š” ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

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

 

 1. ์‹œ์ž‘ ์œ„์น˜๋ถ€ํ„ฐ BFS ํƒ์ƒ‰์„ ์‹œ๋„ํ•œ๋‹ค.

 

 2. ์ „์ฒด ์œ„์น˜์˜ ๊ฒฝ๋กœ๊นŒ์ง€ ์˜ค๋Š”๋ฐ ๋ˆ ์ฝ”๋„ˆ์˜ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.

    ํŠน์ • ์œ„์น˜๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค, ํ˜„์žฌ ์œ„์น˜์˜ ์ฝ”๋„ˆ ํšŸ์ˆ˜๋ณด๋‹ค ์ ์€ ๊ณณ์ธ์ง€ ํฐ ๊ณณ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

    ์ฝ”๋„ˆ ํšŸ์ˆ˜๊ฐ€ ํ˜„์žฌ ์œ„์น˜๋ณด๋‹ค ์ ์€ ๊ณณ๋งŒ ๋ฐฉ๋ฌธํ•œ๋‹ค.

 

 3. ์ฝ”๋„ˆ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์œ„์น˜์˜ ๋ฐฉํ–ฅ ์ธ๋ฑ์Šค์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    ์™ผ์ชฝ ์นธ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์„œ ํ˜„์žฌ ์œ„์น˜๋กœ ์™”๋‹ค๋ฉด, ํ˜„์žฌ ์œ„์น˜์—์„œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ขŒํ‘œ๋งŒ์ด ์ง์ง„์ผ ๊ฒƒ์ด๋‹ค.

    ๋’ค๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ์ฝ”๋„ˆ ํšŸ์ˆ˜๊ฐ€ ํ˜„์žฌ์™€ ๊ฐ™๊ฑฐ๋‚˜ ๊ทธ๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๋ฌด์‹œ๋œ๋‹ค.

    ๋”ฐ๋ผ์„œ ์œ„์น˜๋ฅผ ํ์— ๋„ฃ์„ ๋•Œ๋งˆ๋‹ค, ์–ด๋–ค ๋ฐฉํ–ฅ์—์„œ ์™”๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉํ–ฅ ์ธ๋ฑ์Šค๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด์ค€๋‹ค.

 

 4. ๋ชฉํ‘œ ์œ„์น˜๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ๋ชฉํ‘œ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

    ๋ชฉํ‘œ ์œ„์น˜์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ๋ฐ”๋กœ ์ฝ”๋„ˆ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

    ๋งŒ์•ฝ (0,0)์—์„œ ์ฃผ๋ณ€ํƒ์ƒ‰์„ ํ•  ๋•Œ ํ•˜๋ณด๋‹ค ์šฐ๋ฐฉํ–ฅ์— ๋จผ์ € ์ ‘๊ทผํ•œ๋‹ค๋ฉด,

    (0,0)์‹œ์ž‘ -> ์šฐ -> ํ•˜ -> ์šฐ: ์ฝ”๋„ˆ ๋ˆ ํšŸ์ˆ˜ 2๋ฒˆ

    (0,0)์‹œ์ž‘ -> ํ•˜ -> ์šฐ -> ์šฐ: ์ฝ”๋„ˆ ๋ˆ ํšŸ์ˆ˜ 1๋ฒˆ

    ์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋จผ์ € ๋„์ฐฉํ–ˆ์Œ์—๋„ ์ฝ”๋„ˆ๋ฅผ ๋ˆ ํšŸ์ˆ˜๊ฐ€ ๋” ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค.

 

0 0 X
0 1 2

 

 

 

 

 

 

๐Ÿ™‹‍โ™€๏ธ ์˜๊ฒฌ

 BFS๋Š” ๋ช‡ ๋ฒˆ์„ ํ•˜๊ธด ํ–ˆ์ง€๋งŒ ๊ฐ€๋” ๋ฉ˜๋ถ•์— ๋น ์ง€๋Š” ์ˆœ๊ฐ„์ด ์˜ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 ์˜ค๋Š˜์€ visited ๋ฐฐ์—ด์„ ์„ ์–ธ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฉ˜๋ถ•์— ๋น ์กŒ๋‹ค.

 ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋ผ๋„ ์ตœ์†Œ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋ฉด ์–ด์ฉŒ์ง€?ํ–ˆ๋Š”๋ฐ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ '์ฝ”๋„ˆ' ๋„๋Š” ํšŸ์ˆ˜๋ฅผ ๋”ฐ์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์ด๋ผ๋„ ๋” ๋ˆ ๊ฒฝ๋กœ๋Š” ๋œ ๋ˆ ๊ฒฝ๋กœ๋ณด๋‹ค ํŠน์ • ์œ„์น˜์— ๋Šฆ๊ฒŒ ๋„์ฐฉํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ฆ‰, ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•œ๊ฒŒ ๊ฐ€์žฅ ์ฝ”๋„ˆ๋ฅผ ๋ˆ ํšŸ์ˆ˜๊ฐ€ ์ ์€ ๊ฒƒ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— visited๋ฅผ ์จ๋„ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 visited๋ฅผ ์“ด ์ฝ”๋“œ๋Š” ์ง€์˜๋‹˜ ๊ฒƒ์„ ๊ฐ€์ ธ์™”๋‹ค. ์ง€์˜๋‹˜๋„ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ง ์ž˜ ์งœ์‹œ๋Š” ๋“ฏ ํ•˜๋‹ค.

 

 

 

 

 

 

 

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

public class Main_์ •์˜ฌ_1113_119๊ตฌ๊ธ‰๋Œ€ {

	// BFS. ๋Œ€๊ธฐ์—ด์— ์œ„์น˜๊ฐ’๊ณผ corner๊ฐ’(ํ˜„์žฌ ๋ฐฉํ–ฅ*(1, -1)๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด ์ฆ๊ฐ€) ํ•จ๊ป˜ ์ „๋‹ฌ
	// ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋ฐฐ์—ด์ด๋ผ๋ฉด ์ฝ”๋„ˆ๊ฐ’์ด ๋” ์ž‘์„ ๋•Œ ์žฌ์ง„์ž…
	static int M, N, m, n;
	static int[][] map, val;
	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());	//์„ธ๋กœ
		st = new StringTokenizer(br.readLine());
		m = Integer.parseInt(st.nextToken());
		n = Integer.parseInt(st.nextToken());
		map = new int[M][N];
		val = new int[M][N];
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				val[i][j] = 1000;
			}
		}//input
		System.out.println(bfs());
	}//end of main
	
	private static int bfs() {
		int[] dr = {1,-1,0,0};
		int[] dc = {0,0,1,-1};
		
		int result = Integer.MAX_VALUE;
		Queue<int[]> queue = new LinkedList<>();
		queue.offer(new int[] {0,0,0,-1});	//r,c,cnt,dir
		val[0][0] = 0;
		
		while(queue.size()>0) {
			int[] cur = queue.poll();
			int r = cur[0];
			int c = cur[1];
			int cnt = cur[2];
			int dir = cur[3];
			
			if(r==m && c==n) {
				result = Math.min(result, cnt);
				continue;
			}
			
			for (int i = 0; i < 4; i++) {
				int nr = r + dr[i];
				int nc = c + dc[i];
				int ncnt = cnt;
				
				if(nr<0||nc<0||nr>=M||nc>=N||map[nr][nc]==0||
						val[nr][nc]<=cnt) continue;
				if(dir!=-1) {					
					if(dir!=i) ncnt++;
				}
				val[nr][nc] = ncnt;
				queue.offer(new int[] {nr,nc,ncnt,i});
			}
		}
		return result;
	}//bfs
}//end of class

 

 

 

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

public class Main_1113_119๊ตฌ๊ธ‰๋Œ€ {

	// ์ตœ์†Œ ์ฝ”๋„ˆ๋ฅผ ๋„๋Š” ํšŸ์ˆ˜
	// bfs๋Œ๋ฉด์„œ ์ฝ”๋„ˆ๋„๋Š” ํšŸ์ˆ˜ ์ €์žฅ - ์™„ํƒ.. ์ตœ์†ŒํšŸ์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋ฉด ์ตœ์†Œ๋ณด๋‹ค ํฐ๊ฒฝ์šฐ ํƒˆ๋ฝ

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int m = Integer.parseInt(st.nextToken());
		int n = Integer.parseInt(st.nextToken());

		char[][] map = new char[m][n];
		boolean[][] visited = new boolean[m][n];

		st = new StringTokenizer(br.readLine(), " ");
		int endX = Integer.parseInt(st.nextToken());
		int endY = Integer.parseInt(st.nextToken());

		for (int i = 0; i < n; i++) {
			String input = br.readLine();
			for (int j = 0; j < m; j++) {
				map[i][j] = input.charAt(j << 1);
			}
		}

		int[][] dir = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
		// ์ƒ0 ํ•˜1 ์ขŒ2 ์šฐ3
		Queue<int[]> q = new LinkedList<int[]>();

		if (map[0][1] == '1')
			q.add(new int[] { 0, 1, 3, 0 }); // r c d cnt
		if (map[1][0] == '1')
			q.add(new int[] { 1, 0, 1, 0 });
		visited[0][0] = true;

		int min = 987654321;
		while (q.size() > 0) {
			int[] cur = q.poll();
			int cnt = cur[3];

			visited[cur[0]][cur[1]] = true;

			if (cur[0] == endX && cur[1] == endY) {
				if (min > cnt)
					min = cnt;
				continue;
			}

			for (int i = 0; i < 4; i++) {
				int nr = cur[0] + dir[i][0];
				int nc = cur[1] + dir[i][1];

				if (nr < 0 || nr >= m || nc < 0 || nc >= n || visited[nr][nc] || map[nr][nc] == '0')
					continue;

				if (i == cur[2])
					q.add(new int[] { nr, nc, i, cnt });
				else if (cnt + 1 < min)
					q.add(new int[] { nr, nc, i, cnt + 1 });
			}
		}
		System.out.println(min);
	}
}

 

 

 

 

 

 

 

 

 

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

 

 

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

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