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

 

13459๋ฒˆ: ๊ตฌ์Šฌ ํƒˆ์ถœ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ N, M (3 โ‰ค N, M โ‰ค 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋ณด๋“œ์˜ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธธ์ด M์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ '.', '#', 'O', 'R', 'B'

www.acmicpc.net

 

 

 

 

 

 

๋ฌธ์ œ

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

 

  • ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ N, M (3 โ‰ค N, M โ‰ค 10)
  • '.'์€ ๋นˆ ์นธ, '#'์€ ๊ณต์ด ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์žฅ์• ๋ฌผ ๋˜๋Š” ๋ฒฝ, 'O'๋Š” ๊ตฌ๋ฉ์˜ ์œ„์น˜, 'R'์€ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์˜ ์œ„์น˜, 'B'๋Š” ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ์œ„์น˜
  • ๋ณด๋“œ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ๋ชจ๋‘ '#', ๊ตฌ๋ฉ์˜ ๊ฐœ์ˆ˜๋Š” ํ•œ ๊ฐœ, ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ํ•ญ์ƒ 1๊ฐœ
  • ํŒŒ๋ž€ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์— ๋„ฃ์ง€ ์•Š์œผ๋ฉด์„œ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ 10๋ฒˆ ์ดํ•˜๋กœ ์›€์ง์—ฌ์„œ ๋นผ๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉด 1์„ ์—†์œผ๋ฉด 0์„ ์ถœ๋ ฅ

 

 

 

 

 

ํ’€์ด

๊ฐ ์นธ์ด ์žˆ๊ณ , ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์œ„, ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ๋™์ž‘์ด ์žˆ๊ณ , ์›€์ง์ด๋Š” ํšŸ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.  ๊ทธ๋ฆฌ๊ณ  1ํšŒ, 2ํšŒ, 3ํšŒ..10ํšŒ ์›€์ง์ด๊ธฐ๋กœ ๋ด์•ผํ•˜๋ฏ€๋กœ BFS(๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰) ๋ฌธ์ œ์ด๋‹ค. 

 

 

๊ธฐ์กด์˜ BFS๋ฅผ ํ™œ์šฉํ•œ ํƒ์ƒ‰ ์œ ํ˜•์—์„œ ์‹ฌํ™”๋œ ํ’€์ด๊ฐ€ ์š”๊ตฌ๋œ๋‹ค. '๊ตฌ์Šฌ์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค๋Š” ๊ฒƒ'๊ณผ 'ํ•œ ์นธ๋งŒ ์›€์ง์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์›€์ง์ธ๋‹ค๋Š” ๊ฒƒ', ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ฑฐ..

 

 

  • ๊ณต์ด ๋™์‹œ์— ์›€์ง์ธ๋‹ค๊ณ  ํ•˜์ง€๋งŒ.. ํŒŒ๋ž‘์„ ๋จผ์ € ๊ตด๋ ค์•ผ ํ•œ๋‹ค!
    • ๊ฐ™์€ ์นธ์—๋„ ์žˆ์„ ์ˆ˜๋„ ์—†๊ณ , ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๋จผ์ € ๋น ์ง€๊ฑฐ๋‚˜, ๋‘ ๊ตฌ์Šฌ์ด ๋™์‹œ์— ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์‹คํŒจ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ž‘ ๊ตฌ์Šฌ์„ ๊ตด๋ฆฌ๋Š” ๋™์•ˆ์— 
      • 1) ๋นจ๊ฐ• ๊ตฌ์Šฌ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
        • ์•ž์— ๋นจ๊ฐ• ๊ตฌ์Šฌ์ด ์žˆ๋‹ค๋ฉด, ๋จผ์ € ๊ตด๋ฆฌ๋”๋ผ๋„ ์ตœ์ข… ์œ„์น˜๋Š” ๋นจ๊ฐ• ๊ตฌ์Šฌ๋ณด๋‹ค ํ•œ ์นธ ๋’ค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
      • 2) ๊ตฌ๋ฉ์— ๋น ์ง€๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
        • ํ•˜์ง€๋งŒ ๋น ์ง„๋‹ค๊ณ  ๊ฒŒ์ž„์„ ์ข…๋ฃŒ์‹œํ‚ค๋ฉด ์•ˆ๋œ๋‹ค. ํŒŒ๋ž€์ƒ‰ ๊ตฌ์Šฌ์ด ๋จผ์ € ๋น ์ ธ๋„, ๋‹ค์Œ ํšŒ์—๋Š” ์„ฑ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
5 5
#####
#..R#
#.#.#
#BO.#
#####

(1ํšŒ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ธฐ์šธ์ธ๋‹ค๋ฉด ํŒŒ๋ž‘์ด ๋น ์ง„๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜, ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์›€์ง์ธ๋‹ค๋ฉด ๋นจ๊ฐ• ๊ตฌ์Šฌ์„ ๋„ฃ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

 

 

 

  • ์ข…๋ฃŒ ์กฐ๊ฑด
    • ํŒŒ๋ž‘ ๋จผ์ € ์ด๋™ํ•˜๊ณ  ๋นจ๊ฐ• ๊ตฌ์Šฌ์„ ์ด๋™์‹œํ‚ฌ ๋•Œ, ๋นจ๊ฐ• ๊ตฌ์Šฌ์ด ๋น ์ง -> ๋ฆฌํ„ด 1
    • ์ด๋™ ํšŸ์ˆ˜๊ฐ€ 10ํšŒ๊ฐ€ ๋„˜์Œ -> ๋ฆฌํ„ด 0
    • ํ์— ๋“ค์–ด๊ฐ„ ์›์†Œ๊ฐ€ ์—†์Œ ex) ๊ฐ‡ํžŒ ๊ฒฝ์šฐ -> ๋ฆฌํ„ด 0
    • ํŒŒ๋ž‘ ๊ตฌ์Šฌ์ด ๋จผ์ € ๋น ์ง -> ๋ฐ”๋กœ ๋ฆฌํ„ด์„ ์ค„ ์ˆ˜ ์—†๋‹ค. ๋‹ค์Œ ํƒ์ƒ‰์—์„œ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋„˜๊ธด๋‹ค. ์–ด์ฐจํ”ผ ๋’ค์—์„œ ๋นจ๊ฐ•์„ ๋ชป์ฐพ์œผ๋ฉด ์ด๋™ ํšŸ์ˆ˜๊ฐ€ 10ํšŒ ์ดˆ๊ณผํ•ด ๋๋‚˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

 

 

 

 

  • ํ ๊ตฌํ˜„
    • ๊ณต์€ ๋™์‹œ์— ์›€์ง์ด๋ฏ€๋กœ, ํŒŒ๋ž‘ ๊ตฌ์Šฌ๊ณผ ๋นจ๊ฐ• ๊ตฌ์Šฌ์˜ ์ขŒํ‘œ๋ฅผ Point๋ผ๋Š” ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด ํ์— ๋„ฃ์—ˆ๋‹ค.
      • ๊ตฌ์Šฌ์˜ ๊ตฌ๋ถ„์—†์ด ํ†ตํ•ฉํ•ด์„œ ํ์— ๋‘ ๋ฒˆ ๋”ฐ๋กœ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ตฌ์Šฌ์„ ๊ตด๋ฆฌ๊ฒŒ ๋  ๋•Œ 2๊ฐœ์”ฉ ๋Š์–ด์„œ ๋นผ์ฃผ๋Š” ์ž‘์—…์ด ๋ณ„๋„๋กœ ๋“ค์–ด๊ฐ€์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ํŽธํ•˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
    • Point(bx, by, rx, ry)

 

 

  • ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด
    • visited[bx][by][rx][ry] : 4์ฐจ์›์˜ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•ด์ค€๋‹ค.
    • ํŒŒ๋ž‘(1, 2)์™€ ๋นจ๊ฐ•(1, 1)์„ ์ด์ „์— ๋ฐฉ๋ฌธํ•˜๊ณ , ๋‹ค์Œ์—๋Š” ํŒŒ๋ž‘(1, 2)์™€ ๋นจ๊ฐ•(3, 1)์„ ๋ฐฉ๋ฌธํ•œ๋‹ค๊ณ  ํ•˜์ž. ํŒŒ๋ž‘์ด ์ด์ „์— (1, 2)์„ ๋ฐฉ๋ฌธํ–ˆ์–ด๋„, ๋นจ๊ฐ•์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋ด์•ผ ํ•œ๋‹ค.

 

 

  • ํšŸ์ˆ˜ ๊ณ„์‚ฐ
    • ํ์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฝ‘์•„ ์‚ฌ๋ฐฉํƒ์ƒ‰์„ ํ•˜๊ธฐ ์ „, ํ์˜ size๋ฅผ ๊ณ„์‚ฐํ•ด ๊ทธ๋งŒํผ๋งŒ ํƒ์ƒ‰์„ ๋Œ๋ฆฌ๋„๋ก ํ–ˆ๋‹ค.
    • ํšŸ์ˆ˜ ๊ณ„์‚ฐ์„ ๊ฐ์ฒด์— ๋”ฐ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋‘ฌ์„œ ํ์— ๋„ฃ์„ ๋•Œ๋งˆ๋‹ค +1 ํ•ด์„œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

 

 

๋ช‡ ๋ฒˆ์˜ ์‹คํŒจ ๋์— ์„ฑ๊ณตํ–ˆ๋‹ค... ์˜ˆ์ œ ์ž…์ถœ๋ ฅ์€ ๋‹ค ๋งž๋Š”๋ฐ ์ฑ„์ ๋งŒ ๋Œ๋ฆฌ๋ฉด 7%๋Œ€ 42%๋Œ€์—์„œ ํ‹€๋ ธ๋‹ค. ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์— ์žˆ๋Š” ๋ฐ˜๋ก€  ๋‹ค ๋งž๋Š”๋ฐ๋„ ํ‹€๋ฆฐ๋‹ค๊ณ  ํ•˜๋ฉด ์ด๋™ ํšŸ์ˆ˜์—์„œ ํ‹€๋ ธ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๊ตฌ์Šฌํƒˆ์ถœ2(https://www.acmicpc.net/problem/13460)๋Š” ์™„์ „ ๊ฐ™์€ ๋ฌธ์ œ์ธ๋ฐ ์ถœ๋ ฅ์ด 0, 1์ด ์•„๋‹ˆ๋ผ ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฌป๋Š”๋‹ค. ์ •๋‹ต ๋ถ€๋ถ„์„ 1์ด ์•„๋‹ˆ๋ผ count๋กœ ๋ฐ”๊ฟ”์„œ ์˜ˆ์ œ๋ฅผ ๋Œ๋ ค๋ณด๋‹ˆ ๋‚ด ์ฝ”๋“œ์—์„œ ํšŸ์ˆ˜ ๊ณ„์‚ฐ ๋ถ€๋ถ„์ด ์ž˜๋ชป๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

 

 

 

์ฝ”๋“œ

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class BOJ๊ตฌ์Šฌํƒˆ์ถœ {
	static int N, M;
	static char[][] board;
	static boolean[][][][] visited;
	static int[] dx = { -1, 1, 0, 0 };
	static int[] dy = { 0, 0, -1, 1 };

	static class Point {
		int bx, by, rx, ry; // ํŒŒ๋ž‘ ํ–‰๋ ฌ ์ขŒํ‘œ, ๋นจ๊ฐ• ํ–‰๋ ฌ ์ขŒํ‘œ
		
		Point() {};

		Point(int bx, int by, int rx, int ry) {
			this.bx = bx;
			this.by = by;
			this.rx = rx;
			this.ry = ry;
		}
	}

	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 char[N][M];

		Point start = new Point(); // ๊ตฌ์Šฌ์˜ ์‹œ์ž‘ ์œ„์น˜

		for (int i = 0; i < N; i++) {
			board[i] = br.readLine().toCharArray();

			// ๊ตฌ์Šฌ๊ณผ ๊ตฌ๋ฉ์˜ ์œ„์น˜ ์ €์žฅ
			for (int j = 0; j < M; j++) {
				if (board[i][j] == 'R') {
					start.rx = i;
					start.ry = j;
				} else if (board[i][j] == 'B') {
					start.bx = i;
					start.by = j;
				}
			}
		}

		// ์ฒ˜๋ฆฌ, ๊ฒฐ๊ณผ
		visited = new boolean[N][M][N][M]; // ํŒŒ๋ž‘, ๋นจ๊ฐ•

		System.out.println(bfs(start));
	}

	public static int bfs(Point start) {
		Queue<Point> queue = new LinkedList<>();

		queue.add(start);
		visited[start.bx][start.by][start.rx][start.ry] = true;

		int count = 0;
		while (!queue.isEmpty()) {
			count++;
			
			if (count > 10) { // 10ํšŒ ๋„˜์œผ๋ฉด ์ข…๋ฃŒ
				return 0;
			}
			
			int size = queue.size();
			for(int s = 0; s < size; s++) {
				Point point = queue.poll();
				
				for (int d = 0; d < 4; d++) {
					int nbx = point.bx;
					int nby = point.by;
					int nrx = point.rx;
					int nry = point.ry;

					// ํŒŒ๋ž‘ ์ด๋™
					boolean isFail = false; // ์‹คํŒจ ์—ฌ๋ถ€
					boolean isRed = false; // ๋นจ๊ฐ•์„ ๋งŒ๋‚ฌ๋Š”์ง€
					while (board[nbx][nby] != '#') { // ๋ฒฝ์— ๋‹ฟ๊ธฐ ์ „๊นŒ์ง€
						nbx += dx[d];
						nby += dy[d];

						if (board[nbx][nby] == 'O') { // ๊ตฌ๋ฉ์— ๋น ์ง
							isFail = true;
							break;
						} else if (nbx == nrx && nby == nry) { // ๋นจ๊ฐ• ๋งŒ๋‚ฌ๋Š”์ง€ ํ•™์ธ
							isRed = true;
						}
					}
					nbx -= dx[d];
					nby -= dy[d];

					//ํŒŒ๋ž‘์ด ๊ตฌ๋ฉ์— ๋น ์กŒ์œผ๋ฉด ์ผ๋‹จ ๋„˜๊น€(๋‹ค์Œ ํƒ์ƒ‰์—์„œ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์–ด์ฐจํ”ผ ๋’ค์—์„œ ๋นจ๊ฐ• ๋ชป์ฐพ์œผ๋ฉด ์ค‘๋‹จ๋จ)
					if (isFail) {
						continue;
					}

					if (isRed) { //๋นจ๊ฐ•์„ ๋งŒ๋‚œ์ ์ด ์žˆ์—ˆ์œผ๋ฏ€๋กœ ํ•œ์นธ ๋’ค๋กœ
						nbx -= dx[d];
						nby -= dy[d];
					}

					// ๋นจ๊ฐ• ์ด๋™
					while (board[nrx][nry] != '#') { // ๋ฒฝ ๋‹ฟ๊ธฐ ์ „๊นŒ์ง€
						nrx += dx[d];
						nry += dy[d];

						// ์„ฑ๊ณต
						if (board[nrx][nry] == 'O') { // ๋นจ๊ฐ• ๊ตฌ์Šฌ์ด ๋น ์ง
							return 1;
						}
					}
					nrx -= dx[d];
					nry -= dy[d];
					
					if (nrx == nbx && nry == nby) { // ํŒŒ๋ž‘ ์žˆ์œผ๋ฉด ๋’ค๋กœ ๋ฏธ๋ฃธ
						nrx -= dx[d];
						nry -= dy[d];
					}
					

					if (!visited[nbx][nby][nrx][nry]) { // ๋ฐฉ๋ฌธํ•œ์  ์—†์œผ๋ฉด ์ด๋™
						queue.add(new Point(nbx, nby, nrx, nry));
						visited[nbx][nby][nrx][nry] = true;
					}
				}
			}
		}
		return 0;
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 

  • ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ผผ๊ผผํ•˜๊ฒŒ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ ์•ผ ํ•œ๋‹ค.
  • ์ž์ž˜ํ•œ ์‹ค์ˆ˜๋ฅผ ์ค„์ด์ž..
giraffe_