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

[λ°±μ€€][Node.js] 7576번 : ν† λ§ˆν† 

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

 

 

Algorithm

-  ν† λ§ˆν†  -

 


 

문제

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό 가지고 μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자 λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© λ„£μ–΄μ„œ 창고에 λ³΄κ΄€ν•œλ‹€.

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ˜ μΈμ ‘ν•œ 곳은 μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ λ„€ λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 주지 λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

 

ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

 

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

 

문제 ν’€κΈ°

const readline = require("readline");
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
let arrNum = "";
let graph = [];
let visited = [];
let dx = [0, 0, -1, 1];
let dy = [-1, 1, 0, 0];
let toalCount = 0; // λͺ¨λ“  칸의 개수
let currCount = 0; // λ°©λ¬Έν•œ 칸의 개수
let tomatoCount = []; // 읡은 ν† λ§ˆν†  μœ„μΉ˜
let minDay = 1;
let index = 0;
rl.on("line", function (line) {
	if (!arrNum) arrNum = line.toString();
	else input.push(line.toString());
}).on("close", function () {
	arrNum = arrNum.split(" ").map((el) => Number(el));
	graph = input.map((el) => el.split(" ").map((el) => Number(el)));
	visited = Array.from(Array(arrNum[1]), () => Array(arrNum[0]).fill(false));
	toalCount = arrNum[0] * arrNum[1];
	graph.forEach((el1, idx1) =>
		el1.forEach((el2, idx2) => {
			if (el2 === 1) {
				visited[idx1][idx2] = true;
				currCount++;
				tomatoCount.push([idx1, idx2]);
			}
		})
	);

	BFS();
	if (currCount < toalCount) {
		let result = findFalse();
		if (result === true) console.log(minDay - 1);
		else console.log(-1);
	} else console.log(minDay - 1);
	process.exit();
});

let BFS = () => {
	while (true) {
		let shiftQ = tomatoCount[index++];
        if(!shiftQ) break;
		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 < arrNum[1] && 0 <= ny && ny < arrNum[0]) {
				if (visited[nx][ny] === false) {
					if (graph[nx][ny] === 0) {
						tomatoCount.push([nx, ny]);
						graph[nx][ny] = graph[x][y] + 1;
						if (graph[nx][ny] > minDay) minDay = graph[nx][ny];
					}
					currCount++;
					visited[nx][ny] = true;
				}
			}
		}
	}
	return;
};

let findFalse = () => {
	let torf = true;
	for (let i = 0; i < arrNum[1]; i++) {
		for (let j = 0; j < arrNum[0]; j++) {
			if (!visited[i][j] && graph[i][j] === 0) {
				return false;
			}
		}
	}
	return torf;
};

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€