๐ŸŽฒ ๋ฐฑ์ค€ 16234๋ฒˆ ์ธ๊ตฌ ์ด๋™ [JS]

Jeongeunยท2024๋…„ 5์›” 8์ผ

๋ฐฑ์ค€

๋ชฉ๋ก ๋ณด๊ธฐ
187/188

๐Ÿงถ ํ’€์ด
์ธ๊ตฌ ์ด๋™์„ ์˜์—ญ๋‚˜๋ˆ„๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.
๋‹จ์ˆœ ์˜์—ญ ๋‚˜๋ˆ„๊ธฐ์™€ ๋‹ค๋ฅธ์  :
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);

0๊ฐœ์˜ ๋Œ“๊ธ€