๊ธฐ๋ก๋ฐฉ

BOJ_2206 : ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_2206 : ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

Soom_1n 2023. 8. 6. 15:28

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N * M ํ–‰๋ ฌ ๋งต์—์„œ (1, 1)๋ถ€ํ„ฐ (N, M) ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ์ธ์ ‘ํ•œ ์ƒํ•˜์ขŒ์šฐ๋กœ 1์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ 0, ๋ฒฝ์€ 1๋กœ ํ‘œ์‹œ๋˜๋Š”๋ฐ, 1๋ฒˆ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ–‰๋ ฌ์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋จผ์ € ๋„์ฐฉํ–ˆ์—ˆ๋˜ ์นธ์„ ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ–ˆ๋‹ค๋ฉด, ์ด์–ด์„œ ํƒ์ƒ‰ํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.
    • ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€์•Š๊ณ  ๋จผ์ € ๋„์ฐฉํ–ˆ๋˜ ์นธ์ด๋ฉด ๋” ํƒ์ƒ‰ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • N == 1, M == 1 ์ธ ๊ฒฝ์šฐ๋Š” ๋”ฐ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	private static class Point {
		int x, y;
		boolean flag;

		public Point(int x, int y, boolean flag) {
			this.x = x;
			this.y = y;
			this.flag = flag;
		}
	}

	private static int[] dx = {1, 0, -1, 0};
	private static int[] dy = {0, 1, 0, -1};

	public static void main(String[] args) throws IOException {
		// Input
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());

		int[][] map = new int[N + 1][M + 1];

		for (int i = 1; i <= N; i++) {
			char[] chars = br.readLine().toCharArray();
			for (int j = 1; j <= M; j++) {
				map[i][j] = chars[j - 1] - '0';
			}
		}

		// BFS
		Queue<Point> que = new ArrayDeque<>();
		int[][] visited = new int[N + 1][M + 1]; // 0: ๋ฐฉ๋ฌธ X, 1: ๋ฒฝ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธ, 2: ๋ฒฝ์•ˆ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธ

		que.add(new Point(1, 1, false));
		visited[1][1] = 1;

		int cnt = 1;

		while (!que.isEmpty()) {
			int size = que.size();

			for (int i = 0; i < size; i++) {
				Point point = que.poll();

				if (point.x == N && point.y == M)
					break;

				for (int j = 0; j < dx.length; j++) {
					int row = point.x + dx[j];
					int col = point.y + dy[j];
					if (0 < row && row <= N && 0 < col && col <= M) {
						// ๋ฒฝ์ธ ๊ฒฝ์šฐ
						if (map[row][col] == 1 && !point.flag) {
							visited[row][col] = 1;
							que.add(new Point(row, col, true));
						}
						// ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ
						if (map[row][col] == 0) {
							if (visited[row][col] == 0) {
								visited[row][col] = point.flag ? 1 : 2;
								que.add(new Point(row, col, point.flag));
							} else if (visited[row][col] == 1 && !point.flag) {
								visited[row][col] = 2;
								que.add(new Point(row, col, false));
							}
						}
					}
				}
			}
			cnt++;
			if (visited[N][M] > 0)
				break;
		}

		if (N == 1 && M == 1)
			cnt--;

		// Output
		if (visited[N][M] == 0)
			bw.write(Integer.toString(-1));
		else
			bw.write(Integer.toString(cnt));
		bw.flush();
	}
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • BFS๋ฅผ ์œ„ํ•ด ์ขŒํ‘œ์™€ ๋ฒฝ ๋ถ€์ˆ˜๊ธฐ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๋‹ด์€ Point ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ๋ฐฉ๋ฌธ์ฒดํฌ๋Š” intํ˜• 2์ฐจ์› ๋ฐฐ์—ด visited๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • 0 : ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์Œ.
    • 1 : ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ์Œ.
    • 2 : ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋ฐฉ๋ฌธํ–ˆ์Œ.
  • BFS์˜ while๋ฌธ์—์„œ ํ์˜ ํฌ๊ธฐ๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ผ์น˜์‹œํ‚ค๋ฉฐ ๊ณ„์‚ฐํ–ˆ๋‹ค.
  • 4๋ฐฉํƒ์ƒ‰ ์ด๋™์—์„œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
    • ๋ฒฝ์„ ๋งŒ๋‚ฌ๋Š”๋ฐ ์•„์ง ๋ฒฝ๋ถ€์ˆ˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฉด, ์ผ๋‹จ ๋ถ€์ˆ˜๊ณ  ์ง„ํ–‰ํ•ด๋ณธ๋‹ค.
    • ๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” 2 ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์นธ์ด๋ฉด ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
      • ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ธ๋ฐ, ํ˜„์žฌ ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ง„ํ–‰ํ•ด๋ณธ๋‹ค.
        (๋‹ค๋ฅธ ๊ณณ์„ ๋ถ€์ˆ˜๋Š”๊ฒŒ ๋” ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)
  • N==1์ด๊ณ  M==1 ์ผ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋กœ cnt ๋ฅผ -1ํ•œ๋‹ค.
  • (N, M)์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด cnt๋ฅผ, ์•„๋‹ˆ๋ผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋จผ์ € ๋„์ฐฉํ–ˆ๋”๋ผ๋„, ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ•œ ์‹œ๋„๋ฅผ ์ด์–ด์„œ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ์ค‘์š” ํฌ์ธํŠธ์˜€๋‹ค.
  • N==1 && M==1 ์ธ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๋ฉฐ ์กฐ์‹ฌํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ฝ”๋”ฉ ํ›„์— ๊นŒ๋จน๊ณ  ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•„์„œ 1ํšŒ ํ‹€๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. ์š”์ฆ˜ ํ’€์ด ์ „๋žต์„ ์ ์ง€ ์•Š๊ณ  ๋Œ€์ถฉ ํ’€์ดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋‹ค์‹œ ๊ผผ๊ผผํ•˜๊ฒŒ ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค.

728x90