๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง  ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€] 7569 ํ† ๋งˆํ†  js ํ’€์ด

by megan07 2023. 12. 28.

๐Ÿ’ก ์ ‘๊ทผ๋ฒ•

๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ํ† ๋งˆํ† ๋“ค์ด ๋ชจ๋‘ ์ต๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ
์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ณ , ์ต์€ ํ† ๋งˆํ†  ์ธ์ ‘ ํ† ๋งˆํ† ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ต์œผ๋‹ˆ๊นŒ
=> BFS

1. ์ต์€ ํ† ๋งˆํ† ๋ฅผ ๋ชจ๋‘ ํ์— ๋„ฃ์–ด์ค€๋‹ค

2. ์ต์€ ํ† ๋งˆํ† ์™€ ์ธ์ ‘ํ•˜๊ณ  ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋Š” ํ์— ๋„ฃ์–ด์ค€๋‹ค
     2-1. ๋ฐ•์Šค ์œ„์•„๋ž˜ ํ™•์ธ
     2-2. ๊ฐ™์€ ๋ฐ•์Šค์—์„œ ์ƒํ•˜์ขŒ์šฐ ํ™•์ธ

3. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

 

class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.start = null;
    this.end = null;
    this.size = 0;
  }

  enqueue(val) {
    const newNode = new Node(val);
    if (!this.start) {
      this.start = newNode;
      this.end = newNode;
    } else {
      this.end.next = newNode;
      this.end = newNode;
    }
    return ++this.size;
  }

  dequeue() {
    if (!this.start) return null;

    const tmp = this.start;
    if (this.start === this.end) {
      this.end === null;
    }
    this.start = this.start.next;
    this.size--;

    return tmp.val;
  }
}

const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';


// ์ž…๋ ฅ๊ฐ’์ด ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๊ฐ’์˜ ๊ธธ์ด(n), n๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ์ž…๋ ฅ๊ฐ’์ด ์ฃผ์–ด์งˆ ๋•Œ
const [n, ...input] = require('fs')
  .readFileSync(filePath)
  .toString()
  .trim()
  .split('\n');

function solution(M, N, H, box) {
  //BFS!!!

  const boxes = [];
  const queue = new Queue();

  const dh = [1, -1];
  const dr = [1, -1, 0, 0];
  const dc = [0, 0, 1, -1];
  let max = 0;
  let tomatoes = 0;

  //๋ฐ•์Šค 3์ฐจ์› ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”
  for (let i = 0; i < H; i++) {
    const tmp = [];
    for (let j = 0; j < N; j++) {
      tmp.push([...box[i * N + j]]);
    }
    boxes.push(tmp);
  }

  //3์ฐจ์› ๋ฐฐ์—ด ๋Œ๋ฉด์„œ ์ต์€ ํ† ๋งˆํ† ๋Š” ํ์— ๋„ฃ๊ธฐ
  //์•ˆ ์ต์€ ํ† ๋งˆํ†  ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
  for (let i = 0; i < H; i++) {
    for (let j = 0; j < N; j++) {
      for (let k = 0; k < M; k++) {
        if (boxes[i][j][k] === 1) {
          //ํ์—๋Š” ํ† ๋งˆํ† ๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค ์ •๋ณด H, N, M์™€
          //ํ•ด๋‹น ํ† ๋งˆํ† ๊ฐ€ ์ต๊ธฐ๊นŒ์ง€ ํ•„์š”ํ•œ ์ตœ์†Œ ์ผ์ž๋ฅผ ๋„ฃ์–ด์คŒ
          queue.enqueue([i, j, k, 0]);
        } else if (boxes[i][j][k] === 0) {
          tomatoes++;
        }
      }
    }
  }

  //ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
  while (queue.size) {
    const val = queue.dequeue();

    //ํ† ๋งˆํ†  ์œ„์น˜ H, R, C, ์ตœ์†Œ ์ผ์ž
    const [h, r, c, cnt] = val;
    max = Math.max(max, cnt);

    //์œ„์•„๋ž˜ ํ™•์ธ
    //์ต์€ ํ† ๋งˆํ† ์™€ ์ธ์ ‘ํ•˜๊ณ  ์•„์ง ์•ˆ ์ต์€ ํ† ๋งˆํ† ๋งŒ ํ์— ๋„ฃ์–ด์คŒ
    for (let i = 0; i < 2; i++) {
      if (h + dh[i] >= 0 && h + dh[i] < H && boxes[h + dh[i]][r][c] === 0) {
        boxes[h + dh[i]][r][c] = 1;
        queue.enqueue([h + dh[i], r, c, cnt + 1]);
        tomatoes--;
      }
    }

    //์ƒํ•˜์ขŒ์šฐ ํ™•์ธ
    //์ต์€ ํ† ๋งˆํ† ์™€ ์ธ์ ‘ํ•˜๊ณ  ์•„์ง ์•ˆ ์ต์€ ํ† ๋งˆํ† ๋งŒ ํ์— ๋„ฃ์–ด์คŒ
    for (let j = 0; j < 4; j++) {
      if (
        r + dr[j] >= 0 &&
        r + dr[j] < N &&
        c + dc[j] >= 0 &&
        c + dc[j] < M &&
        boxes[h][r + dr[j]][c + dc[j]] === 0
      ) {
        boxes[h][r + dr[j]][c + dc[j]] = 1;
        queue.enqueue([h, r + dr[j], c + dc[j], cnt + 1]);
        tomatoes--;
      }
    }
  }

  //์•ˆ ์ต์€ ํ† ๋งˆํ† ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด -1, ์•„๋‹ˆ๋ฉด ์ผ์ž ์ถœ๋ ฅ
  return tomatoes > 0 ? -1 : max;
}

const nArr = n.split(' ').map(Number);

const answer = solution(
  nArr[0],
  nArr[1],
  nArr[2],
  input.map((r) => r.split(' ').map(Number)),
);

console.log(answer);

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