๐งถ ํ์ด
์ธ๊ตฌ ์ด๋์ ์์ญ๋๋๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
๋จ์ ์์ญ ๋๋๊ธฐ์ ๋ค๋ฅธ์ :
1. ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋๋ผ๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ธฐ (changePoints)
2. dfs๋ฅผ ์ํํ๊ณ ๋์ changePoints์ ์ ์ฅ๋ ์ขํ์ ๊ฐ์ ์๋ก์ด ์ธ๊ตฌ์๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.
์ ๊ณผ์ ์ด ์ํ๋๋ฉด ํ๋ฃจ๊ฐ ์ง๋ ๊ฒ์ด๋ค. change ๋ณ์๋ก ์ธ๊ตฌ์ด๋์ด ์ผ์ด๋ฌ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ while ๋ฐ๋ณต๋ฌธ์ ์ํํ๋ค.
์ฝ๋
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [N, L, R] = input.shift().split(" ").map(Number);
const arr = input.map((el) => el.split(" ").map(Number));
let answer = 0;
const dir = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0],
];
const dfs = (i, j, changePoints, visited) => {
const stack = [[i, j]];
visited[i][j] = true;
let value = 0;
while (stack.length) {
let [Y, X] = stack.pop();
value += arr[Y][X];
changePoints.push([Y, X]);
for (let d = 0; d < 4; d++) {
const [nextY, nextX] = [Y + dir[d][0], X + dir[d][1]];
if (
nextY < 0 ||
nextX < 0 ||
nextY >= N ||
nextX >= N ||
visited[nextY][nextX] ||
Math.abs(arr[Y][X] - arr[nextY][nextX]) < L ||
Math.abs(arr[Y][X] - arr[nextY][nextX]) > R
)
continue;
stack.push([nextY, nextX]);
visited[nextY][nextX] = true;
}
}
return value;
};
let change = true;
while (change) {
let visited = Array.from(new Array(N), () => new Array(N).fill(false));
change = false;
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
const changePoints = [];
if (!visited[i][j]) {
let changeValue = dfs(i, j, changePoints, visited);
for (let c = 0; c < changePoints.length; c++) {
const [y, x] = changePoints[c];
arr[y][x] = Math.floor(changeValue / changePoints.length);
}
if (changePoints.length > 1) change = true;
}
}
}
if (change) answer++;
}
console.log(answer);