λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
κ°œμΈκ³΅λΆ€/Algorithm

[λ°±μ€€][Node.js] 2178번 : 미둜 탐색

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2021. 7. 29.

 

 

Algorithm

-  미둜 탐색 -

 


 

문제

N×M크기의 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λŠ” λ―Έλ‘œκ°€ μžˆλ‹€.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

λ―Έλ‘œμ—μ„œ 1은 이동할 수 μžˆλŠ” 칸을 λ‚˜νƒ€λ‚΄κ³ , 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ―Έλ‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N, M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. ν•œ μΉΈμ—μ„œ λ‹€λ₯Έ 칸으둜 이동할 λ•Œ, μ„œλ‘œ μΈμ ‘ν•œ 칸으둜만 이동할 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 15칸을 μ§€λ‚˜μ•Ό (N, M)의 μœ„μΉ˜λ‘œ 이동할 수 μžˆλ‹€. 칸을 μ…€ λ•Œμ—λŠ” μ‹œμž‘ μœ„μΉ˜μ™€ 도착 μœ„μΉ˜λ„ ν¬ν•¨ν•œλ‹€.

 

μž…μΆœλ ₯ μ˜ˆμ‹œ

 

문제 ν’€κΈ°

let BFS = function (q, v, r) {
	while (q.length !== 0) {
		let shiftQ = q.shift();
		let [x, y] = [shiftQ[0], shiftQ[1]];
		for (let i = 0; i < 4; i++) {
			let nx = x + dx[i];
			let ny = y + dy[i];
			// λ°©λ¬Έν•œμ μ΄ μ—†κ³  0이 μ•„λ‹ˆλΌλ©΄
			if (0 <= nx && nx < r[0] && 0 <= ny && ny < r[1]) {
				if (v[nx][ny] === false && input[nx][ny] !== 0) {
					q.push([nx, ny]);
					input[nx][ny] = input[x][y] + 1;
					v[nx][ny] = true;
				}
			}
		}
	}
	return;
};

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
let queue = [];
let dx = [0, 0, -1, 1]; // xκΈ°μ€€ μƒν•˜μ’Œμš°
let dy = [-1, 1, 0, 0]; // yκΈ°μ€€ μƒν•˜μ’Œμš°
rl.on("line", function (line) {
	input.push(line.toString());
}).on("close", function () {
	let range = input
		.shift()
		.split(" ")
		.map((el) => Number(el));
	input = input.map((el) => el.split("").map((el) => Number(el)));
	let visited = Array.from(Array(range[0]), () => Array(range[1]).fill(false));
	visited[0][0] = true;
	queue.push([0, 0]);
	BFS(queue, visited, range);
	console.log(input[range[0] - 1][range[1] - 1]);
	process.exit();
});

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€