티스토리 뷰

https://www.acmicpc.net/problem/16234

 

16234번: 인구 이동

N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모

www.acmicpc.net

const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n");
const [N, L, R] = input.shift().trim().split(' ').map(Number);
let board = input.map(v => v.trim().split(' ').map(Number))



const dx = [0, 0, -1, 1];
const dy = [-1, 1, 0, 0];

let cnt = 0;
let flag = true;
while (flag) {
  flag = false;

  let visited = Array.from(Array(N), () => Array(N).fill(false))
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
      if (!visited[i][j]) {
        let united = [];
        let q = [];
        united.push([i, j])
        let sum = board[i][j]
        q.push([i, j])
        visited[i][j] = true;
        while (q.length > 0) {
          const [x, y] = q.shift();
          for (let k = 0; k < 4; k++) {
            const nx = x + dx[k];
            const ny = y + dy[k];
            if (nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
              const diff = Math.abs(board[x][y] - board[nx][ny])
              if (diff >= L && diff <= R) {
                visited[nx][ny] = true;
                united.push([nx, ny])
                q.push([nx, ny])
                sum += board[nx][ny]
              }
            }
          }
        }
        if (united.length > 1) {
          flag = true;
          let result = Math.floor(sum / united.length);
          united.forEach(v => {
            const [x, y] = v;
            board[x][y] = result
          })
        }
      }
    }
  }
  // console.log('============')
  // console.log(cnt, board)
  // console.log('============')
  if (flag) cnt++;
}

console.log(cnt)

https://www.acmicpc.net/problem/16234

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함