๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ์ƒ๋ฒ” ๋นŒ๋”ฉ(๋ฐฑ์ค€ - 6593)

๐Ÿ“‹ ๋ฌธ์ œ

๋‹น์‹ ์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์— ๊ฐ‡ํžˆ๊ณ  ๋ง์•˜๋‹ค. ์—ฌ๊ธฐ์„œ ํƒˆ์ถœํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์€ ๋ฌด์—‡์ผ๊นŒ? ์ƒ๋ฒ” ๋นŒ๋”ฉ์€ ๊ฐ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ 1์ธ ์ •์œก๋ฉด์ฒด(๋‹จ์œ„ ์ •์œก๋ฉด์ฒด)๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. ๊ฐ ์ •์œก๋ฉด์ฒด๋Š” ๊ธˆ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ๋น„์–ด์žˆ์–ด์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ๋‹น์‹ ์€ ๊ฐ ์นธ์—์„œ ์ธ์ ‘ํ•œ 6๊ฐœ์˜ ์นธ(๋™,์„œ,๋‚จ,๋ถ,์ƒ,ํ•˜)์œผ๋กœ 1๋ถ„์˜ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ๋ฐ”๊นฅ๋ฉด๋„ ๋ชจ๋‘ ๊ธˆ์œผ๋กœ ๋ง‰ํ˜€์žˆ์–ด ์ถœ๊ตฌ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹น์‹ ์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์„ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด๊นŒ?

์ž…๋ ฅ

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ L, R, C๋กœ ์‹œ์ž‘ํ•œ๋‹ค. L(1 ≤ L ≤ 30)์€ ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ์ธต ์ˆ˜์ด๋‹ค. R(1 ≤ R ≤ 30)๊ณผ C(1 ≤ C ≤ 30)๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ํ•œ ์ธต์˜ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ ๋‹ค์Œ ๊ฐ ์ค„์ด C๊ฐœ์˜ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ R๊ฐœ์˜ ํ–‰์ด L๋ฒˆ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ๋ฌธ์ž๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์˜ ํ•œ ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธˆ์œผ๋กœ ๋ง‰ํ˜€์žˆ์–ด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ์นธ์€ '#'์œผ๋กœ ํ‘œํ˜„๋˜๊ณ , ๋น„์–ด์žˆ๋Š” ์นธ์€ '.'์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋‹น์‹ ์˜ ์‹œ์ž‘ ์ง€์ ์€ 'S'๋กœ ํ‘œํ˜„๋˜๊ณ , ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ๊ตฌ๋Š” 'E'๋กœ ํ‘œํ˜„๋œ๋‹ค. ๊ฐ ์ธต ์‚ฌ์ด์—๋Š” ๋นˆ ์ค„์ด ์žˆ์œผ๋ฉฐ, ์ž…๋ ฅ์˜ ๋์€ L, R, C๊ฐ€ ๋ชจ๋‘ 0์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ์‹œ์ž‘ ์ง€์ ๊ณผ ์ถœ๊ตฌ๋Š” ํ•ญ์ƒ ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ๋นŒ๋”ฉ์— ๋Œ€ํ•ด ํ•œ ์ค„์”ฉ ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

Escaped in x minute(s).

์—ฌ๊ธฐ์„œ x๋Š” ์ƒ๋ฒ” ๋นŒ๋”ฉ์„ ํƒˆ์ถœํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ์ตœ๋‹จ ์‹œ๊ฐ„์ด๋‹ค.

๋งŒ์ผ ํƒˆ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

Trapped!

์ž…์ถœ๋ ฅ ์˜ˆ

์˜ˆ์ œ ์ž…๋ ฅ  ์˜ˆ์ œ ์ถœ๋ ฅ
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###
Escaped in 11 minute(s).
Trapped!

โœ๏ธ ํ’€์ด

์ด๋ฌธ์ œ๋Š” BFS ๋ฌธ์ œ์˜€๋‹ค. ๋‹ค๋งŒ ์กฐ๊ธˆ ํŠน์ดํ•œ์ ์ด 3์ฐจ์›์ด๋ผ๋Š” ์ ์ด๋‹ค.

 

3์ฐจ์›์œผ๋กœ ๋˜์–ด์žˆ์–ด ์กฐ๊ธˆ ๋ณต์žกํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ž…๋ ฅ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ณผ์ •์ด ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์› ๋‹ค. ๋‚˜๋Š” L, R, C๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ์ฒ˜์Œ L, R, C๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด๋‘๊ณ  map์„ ๊ตฌ์„ฑํ–ˆ๋‹ค. tempArr์ด๋ผ๋Š” ์ž„์‹œ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด๋‘๊ณ  ์ธต๋งˆ๋‹ค ๋นˆ ์ค„๋กœ ๊ตฌ๋ถ„๋˜์–ด ๋นˆ ์ค„์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด map์ด๋ผ๋Š” ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž„์‹œ๋ฐฐ์—ด tempArr์— ์ž…๋ ฅ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋Œ๋‹ค๋ณด๋ฉด map์„ ๋ชจ๋‘ ๊ตฌ์„ฑํ•˜๊ณ  ์ƒˆ๋กœ์šด L, R, C๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด๋•Œ BFS๋ฅผ ๋Œ๋ฆฌ๊ณ  ์ƒˆ๋กœ L, R, C์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  map์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋งŒ์•ฝ "0 0 0"์ด L, R, C์— ํ• ๋‹นํ•˜์ง€๋งŒ ๋‹ค์Œ ์ž…๋ ฅ๋ฌธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋ ˆ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.

 

BFS ํ•จ์ˆ˜๋Š” check๋ฐฐ์—ด๊ณผ queue ๋ฐฐ์—ด, cnt ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋™์ž‘ํ•œ๋‹ค. ์ตœ์†Œ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ์ƒํ™ฉ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋ชจ๋‘ queue์— ๋„ฃ๊ณ  ์ด๋•Œ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค. ํ•ด๋‹น ๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋™์ž‘ ํšŸ์ˆ˜์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ queue์— ์ƒˆ๋กœ์ด ์ €์žฅ๋œ๋‹ค. 3์ฐจ์›์ด๊ธฐ ๋•Œ๋ฌธ์— z, x, y ์„ธ๊ฐœ์˜ ๋ณ€์ˆ˜(์ธ๋ฑ์Šค)๋กœ ํ•ด๋‹น ์œ„์น˜๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€("."), ๊ฐˆ ์ˆ˜ ์—†๋Š”์ง€("#"), ํƒˆ์ถœ๊ตฌ์ธ์ง€("E")๋ฅผ ํ™•์ธํ•˜๊ณ  check ๋ฐฐ์—ด์— ๋”ฐ๋ผ ๋ฐฉ๋ฌธํ–ˆ๋˜ ์œ„์น˜๋Š” ์ œ์™ธํ•˜๊ณ  ํƒ์ƒ‰ํ•œ๋‹ค. 

 

๋ฐ˜ํ™˜๋œ ๊ฐ’์€ cnt์ธ๋ฐ ๋งŒ์•ฝ ๋ชจ๋“  ๋™์ž‘์„ ์ˆ˜ํ–‰ํ–ˆ์Œ์—๋„ ํƒˆ์ถœ๊ตฌ("E")์— ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด ์œ ํšจํ•œ์ง€์— ๋”ฐ๋ผ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ–ˆ๋‹ค. 

โŒจ๏ธ ์ฝ”๋“œ

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './testcase/6593.txt';

let inputs = fs.readFileSync(filePath).toString().trim().split('\n');

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

const bfs = (board, L, R, C) => {
  const check = [...new Array(L)].map(_ => [...new Array(R)].map(_ => new Array(C).fill(0)));
  let start;
  outer: for (let i = 0; i < L; i++) {
    for (let j = 0; j < R; j++) {
      for (let k = 0; k < C; k++) {
        if (board[i][j][k] === 'S') {
          start = [i, j, k];
          break outer;
        }
      }
    }
  }
  const queue = [start];
  let cnt = 0;
  check[start[0]][start[1]][start[2]] = 1;

  while (queue.length) {
    const len = queue.length;
    for (let i = 0; i < len; i++) {
      const [z, x, y] = queue.shift();
      for (let k = 0; k < 6; k++) {
        const zz = z + dz[k];
        const xx = x + dx[k];
        const yy = y + dy[k];

        if (zz < 0 || zz >= L || xx < 0 || xx >= R || yy < 0 || yy >= C) continue;
        if (board[zz][xx][yy] === '#') continue;
        if (check[zz][xx][yy]) continue;
        if (board[zz][xx][yy] === 'E') return cnt + 1;

        check[zz][xx][yy] = 1;
        queue.push([zz, xx, yy]);
      }
    }
    cnt += 1;
  }
  return 0;
};

let map = [];
let tempArr = [];
let L, R, C;
for (const input of inputs) {
  const temp = input.split(' ').map(Number);
  if (temp.length >= 3) {
    if (map.length) {
      const res = bfs(map, L, R, C);
      console.log(res ? `Escaped in ${res} minute(s).` : 'Trapped!');
    }
    [L, R, C] = temp;
    map = [];
  } else {
    if (!input) {
      map.push([...tempArr]);
      tempArr = [];
    } else {
      tempArr.push(input);
    }
  }
}