μ½”λ”© ν…ŒμŠ€νŠΈ/λ°±μ€€

[λ°±μ€€]16234번 '인ꡬ 이동' 문제 풀이 - JavaScript

μš©λ‡½ 2023. 8. 12. 17:01
λ°˜μ‘ν˜•

[λ°±μ€€]16234번 '인ꡬ 이동' 문제 풀이 - JavaScript

λ‚œμ΄λ„: κ³¨λ“œ 4

풀이 μ•Œκ³ λ¦¬μ¦˜: BFS

문제

N×N크기의 λ•…이 μžˆκ³ , λ•…은 1×1개의 μΉΈμœΌλ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€. κ°κ°μ˜ λ•…μ—λŠ” λ‚˜λΌκ°€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©°, rν–‰ c열에 μžˆλŠ” λ‚˜λΌμ—λŠ” A[r][c]λͺ…이 μ‚΄κ³  μžˆλ‹€. μΈμ ‘ν•œ λ‚˜λΌ μ‚¬μ΄μ—λŠ” κ΅­κ²½μ„ μ΄ μ‘΄μž¬ν•œλ‹€. λͺ¨λ“  λ‚˜λΌλŠ” 1×1 ν¬κΈ°μ΄κΈ° λ•Œλ¬Έμ—, λͺ¨λ“  κ΅­κ²½μ„ μ€ μ •μ‚¬κ°ν˜• ν˜•νƒœμ΄λ‹€.

μ˜€λŠ˜λΆ€ν„° μΈκ΅¬ μ΄λ™μ΄ μ‹œμž‘λ˜λŠ” λ‚ μ΄λ‹€.

인ꡬ μ΄λ™μ€ ν•˜λ£¨ λ™μ•ˆ λ‹€μŒκ³Ό κ°™μ΄ μ§„ν–‰λ˜κ³ , λ” μ΄μƒ μ•„λž˜ λ°©λ²•μ— μ˜ν•΄ μΈκ΅¬ μ΄λ™μ΄ μ—†μ„ λ•ŒκΉŒμ§€ μ§€μ†λœλ‹€.

 

  • ꡭ경선을 κ³΅μœ ν•˜λŠ” 두 λ‚˜λΌμ˜ 인ꡬ 차이가 Lλͺ… 이상, Rλͺ… μ΄ν•˜λΌλ©΄, 두 λ‚˜λΌκ°€ κ³΅μœ ν•˜λŠ” ꡭ경선을 였늘 ν•˜λ£¨ λ™μ•ˆ μ—°λ‹€.
  • μœ„μ˜ 쑰건에 μ˜ν•΄ μ—΄μ–΄μ•Όν•˜λŠ” ꡭ경선이 λͺ¨λ‘ μ—΄λ Έλ‹€λ©΄, 인ꡬ 이동을 μ‹œμž‘ν•œλ‹€.
  • ꡭ경선이 μ—΄λ €μžˆμ–΄ μΈμ ‘ν•œ μΉΈλ§Œμ„ μ΄μš©ν•΄ 이동할 수 있으면, κ·Έ λ‚˜λΌλ₯Ό 였늘 ν•˜λ£¨ λ™μ•ˆμ€ 연합이라고 ν•œλ‹€.
  • 연합을 이루고 μžˆλŠ” 각 칸의 μΈκ΅¬μˆ˜λŠ” (μ—°ν•©μ˜ 인ꡬ수) / (연합을 이루고 μžˆλŠ” 칸의 개수)κ°€ λœλ‹€. νŽΈμ˜μƒ μ†Œμˆ˜μ μ€ 버린닀.
  • 연합을 ν•΄μ²΄ν•˜κ³ , λͺ¨λ“  κ΅­κ²½μ„ μ„ λ‹«λŠ”λ‹€.

각 λ‚˜λΌμ˜ μΈκ΅¬μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μΈκ΅¬ μ΄λ™μ΄ λ©°μΉ  λ™μ•ˆ λ°œμƒν•˜λŠ”지 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„에 N, L, R이 μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100)

λ‘˜μ§Έ μ€„λΆ€ν„° N개의 μ€„에 κ° λ‚˜λΌμ˜ μΈκ΅¬μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. rν–‰ c열에 μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” A[r][c]의 κ°’이닀. (0 ≤ A[r][c] ≤ 100)

인ꡬ μ΄λ™μ΄ λ°œμƒν•˜λŠ” μΌμˆ˜κ°€ 2,000번 λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μ€ μž…λ ₯만 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

인ꡬ 이동이 λ©°μΉ  λ™μ•ˆ λ°œμƒν•˜λŠ”μ§€ 첫째 쀄에 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 

2 20 50
50 30
20 40

예제 좜λ ₯ 1 

1

예제 1

λ°˜μ‘ν˜•

풀이 μ½”λ“œ πŸ’‘

const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');

class Queue {
  constructor() {
    this.items = {};
    this.headIndex = 0;
    this.tailIndex = 0;
  }

  enqueue(item) {
    this.items[this.tailIndex] = item;
    this.tailIndex++;
  }

  dequeue() {
    const item = this.items[this.headIndex];
    delete this.items[this.headIndex];
    this.headIndex++;
    return item;
  }

  peek() {
    return this.items[this.headIndex];
  }

  size() {
    return this.tailIndex - this.headIndex;
  }
}

const [n, l, r] = input[0].split(' ').map(Number);
const maps = input.slice(1).map((row) => row.split(' ').map(Number));
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
let totalCount = 0;

const bfs = (x, y, visited) => {
  const united = [[x, y]];
  visited[x][y] = true;
  let sum = maps[x][y];
  const queue = new Queue();
  queue.enqueue([x, y]);

  while (queue.size() !== 0) {
    const [x, y] = queue.dequeue();

    for (let i = 0; i < 4; i++) {
      const nx = x + dx[i];
      const ny = y + dy[i];

      if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
      if (visited[nx][ny]) continue;

      const diff = Math.abs(maps[x][y] - maps[nx][ny]);

      if (diff >= l && diff <= r) {
        visited[nx][ny] = true;
        queue.enqueue([nx, ny]);
        sum += maps[nx][ny];
        united.push([nx, ny]);
      }
    }
  }

  const avg = Math.floor(sum / united.length);

  for (const unit of united) {
    const [i, j] = unit;
    maps[i][j] = avg;
  }
};

while (true) {
  const visited = Array.from({ length: n }, () => Array(n).fill(false));
  let count = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (!visited[i][j]) {
        bfs(i, j, visited);
        count++;
      }
    }
  }
  if (count === n * n) break;
  totalCount++;
}

console.log(totalCount);

풀이 ν•΄μ„€ πŸ’‘

더 이상 이동이 ν•„μš” 없을 λ•ŒκΉŒμ§€ BFS ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

κ·Έλž˜μ„œ BFS ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  countλ₯Ό ν•΄μ£Όλ©΄μ„œ 맡의 전체 크기만큼 λ°˜λ³΅μ„ ν•΄μ€€λ‹€.

 

BFS ν•¨μˆ˜μ—μ„œλŠ” μš”μ†Œμ— λŒ€ν•œ 상, ν•˜, 쒌, 우둜 탐색을 ν•œλ‹€.

 

탐색이 κ°€λŠ₯ν•œ λ²”μœ„μ™€ ν˜„μž¬ μš”μ†Œμ™€ λ‹€μŒ μš”μ†Œμ˜ κ°’μ˜ 차이가 l 이상 r μ΄ν•˜λ©΄ 계산에 λ“€μ–΄κ°„λ‹€.

ν•œλ²ˆ λ°©λ¬Έ ν–ˆλ˜ 곳은 λ‹€μ‹œ λ°©λ¬Έν•΄μ„œ κ³„μ‚°λ˜μ§€ μ•Šλ„λ‘ λ°©λ¬Έ 처리λ₯Ό ν•΄μ£Όκ³ ,

큐에 λ„£μ–΄μ£Όλ©΄μ„œ sum에 이동이 ν•„μš”ν•œ μ§€μ—­μ˜ 인ꡬ수λ₯Ό λ”ν•œλ‹€.

그리고 이동이 ν•„μš”ν•œ μ§€μ—­μ˜ 인ꡬ  수의 μ’Œν‘œλ₯Ό united 배열에 넣어주도둝 ν•œλ‹€.

 

큐가 λΉŒλ•ŒκΉŒμ§€ 반볡이 λλ‚˜λ©΄ united λ°°μ—΄μ˜ λ°˜λ³΅λ¬Έμ„ μ‹€ν–‰ν•˜λŠ”λ° maps에 ν•΄λ‹Ή μ’Œν‘œμ˜ 값을 ν‰κ· κ°’μœΌλ‘œ λ³€ν™˜ν•΄ μ€€λ‹€.

 

λ°˜μ‘ν˜•