๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 14442_๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2

๋ฟŒ์•ผ._. 2026. 1. 5. 11:22
๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/14442)

< ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2 >

 

๋ฌธ์ œ ํ’€์ด 

 

ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋ฒฝ์ด ์—†๋‹ค๋ฉด ์ด๋™, ๋ฒฝ์ด ์žˆ๋‹ค๋ฉด ํ˜„์žฌ๊นŒ์ง€ ๋ถ€์ˆœ ๋ฒฝ ๊ฐœ์ˆ˜๋ฅผ ๋ณด๊ณ  ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•œ๋‹ค.

 

my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _14442_ { // ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2
	static int arr[][], n, m, k;
	static boolean visited[][][];

	static class Pair {
		int x, y, d, w;

		public Pair(int x, int y, int d, int w) {
			this.x = x;
			this.y = y;
			this.d = d;
			this.w = w;
		}
	}

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

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

		arr = new int[n][m];
		visited = new boolean[k + 1][n][m];

		for (int i = 0; i < n; i++) {
			String str = bf.readLine();
			for (int j = 0; j < m; j++) {
				arr[i][j] = str.charAt(j) - '0';
			}
		}

		if (n == 1 && m == 1) {
			System.out.println(1);
		} else {
			System.out.println(bfs());
		}

	}

	private static int bfs() {
		Queue<Pair> queue = new LinkedList<>();
		queue.add(new Pair(0, 0, 1, 0));
		visited[0][0][0] = true;

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

		while (!queue.isEmpty()) {
			Pair pair = queue.poll();
			for (int i = 0; i < 4; i++) {
				int x = pair.x + dx[i];
				int y = pair.y + dy[i];
				if (x >= 0 && x < n && y >= 0 && y < m) {
					if (arr[x][y] == 0 && !visited[pair.w][x][y]) {
						if (x == n - 1 && y == m - 1) {
							return pair.d + 1;
						}
						visited[pair.w][x][y] = true;
						queue.add(new Pair(x, y, pair.d + 1, pair.w));
					} else if (arr[x][y] == 1 && pair.w + 1 <= k && !visited[pair.w + 1][x][y]) {
						if (x == n - 1 && y == m - 1) {
							return pair.d + 1;
						}
						visited[pair.w + 1][x][y] = true;
						queue.add(new Pair(x, y, pair.d + 1, pair.w + 1));
					}
				}
			}
		}
		return -1;
	}
}
๋ณ€์ˆ˜)
n, m, k : ๋งต ํฌ๊ธฐ, ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ์ˆ˜
arr : ๋งต
visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€  

 

Pair

ํ˜„์žฌ ์œ„์น˜์™€ ์ด๋™ ๊ฑฐ๋ฆฌ, ๋ถ€์ˆœ ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

Main

๋งต ํฌ๊ธฐ n, m๊ณผ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ์ˆ˜์ธ k๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ๋งต ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ arr์— ์ €์žฅํ•œ๋‹ค. ๋งŒ์•ฝ n๊ณผ m ๊ฐ’์ด 1์ด๋ผ๋ฉด ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 1์ด๋ฏ€๋กœ 1์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด bfs() ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

bfs()

ํ์— ์‹œ์ž‘์œ„์น˜ (0,0)๊ณผ ์ด๋™๊ฑฐ๋ฆฌ 1, ๋ถ€์ˆœ ๋ฒฝ์˜ ๊ฐœ์ˆ˜ 0์„ ๊ฐ€์ง„ Pair ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ถ€์ˆœ ๋ฒฝ์˜ ๊ฐœ์ˆ˜ 0๊ณผ ํ˜„์žฌ ์œ„์น˜ (0,0)์„ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ ํ›„ ๋งต ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด

1) ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด -> ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋ฐ ํ์— ์ €์žฅ 

2) ๋ฒฝ์ด๊ณ  ์•„์ง k๊ฐœ์˜ ๋ฒฝ์„ ์•ˆ ๋ถ€์‰ˆ๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด -> ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ํ์— ์ €์žฅ

์ด๋•Œ, ๋‘˜ ๋‹ค (n-1, m-1) ์œ„์น˜์— ๋„์ฐฉํ–ˆ๋‹ค๋ฉด ํ˜„์žฌ ์ด๋™ ๊ฑฐ๋ฆฌ +1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

(n-1, m-1)์— ๋„์ฐฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.



 

'๐ŸŒžAlgorithm > ๐Ÿ”ฅBaekjoon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Baekjoon] 2294_๋™์ „ 2  (0) 2026.01.07
[Baekjoon] 11054_๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด  (0) 2026.01.06
[Baekjoon] 25101_Robin Hood  (0) 2025.12.18
[Baekjoon] 27589_Streets Ahead  (0) 2025.12.17
[Baekjoon] 6235_Argus  (0) 2025.12.16