[백준/JS] 상범빌딩 6593

코린·2023년 8월 9일
0

알고리즘

목록 보기
28/44
post-thumbnail

문제


✏️ 문제풀이


참고블로그

3차원배열을 이용해야 하는 문제입니다.
입력도 여러번 받아야 합니다.

입력받을 때 주의해야할 점이 공백!을 꼭 무시해줘야 한다는 점입니다.각 층을 구별짓기 위해서 줄바꿈을 이용했으므로 이를 꼭 없애줘야 합니다. trim()을 이용하면 됩니다.

추가로 새로운 LRC 값을 받기전에 한 줄을 꼭 없애줘야 합니다. 이때는 trim()이 아니라 shift()를 이용해서 한 줄을 삭제했습니다.

while (true) {
   let [L, R, C] = input.shift().trim().split(' ').map(Number);

   if (L === 0) break;

   let map = [];

   for (let i = 0; i < L; i++) {
       let row = [];
       for (let j = 0; j < R; j++) {
           row.push(input.shift().trim().split(''));
       }
       map.push(row);
       input.shift();
   }

   ans.push(bfs(findStart(map, L, R, C), map, L, R, C));
}

층이 있어서 위층 아래층으로 옮겨 다닐 수 있기 때문에 이동방향을 아래와 같이 정의하면 됩니다. 아무곳에서나 위 아래로 이동할 수 있습니다.

let direction = [
   [1, 0, 0],
   [-1, 0, 0],
   [0, 1, 0],
   [0, -1, 0],
   [0, 0, 1],
   [0, 0, -1],
];

시작점부터 도착점까지 이동하면 되는 문제이므로 완전탐색을 이용하면 됩니다. 저는 BFS를 이용했습니다.

기존 bfs와 다른점이라 한다면 상,하로 이동할 수 있는 경우가 생겼다는 것입니다. 단순히 이동방향과 관련된 반복문에 상,하 이동 경우를 추가해주면 됩니다.

function bfs(tmp_q, map, L, R, C) {
   let queue = [tmp_q];
   map[queue[0][0]][queue[0][1]][queue[0][2]] = '#';

   while (queue.length) {
       let [l, y, x, cnt] = queue.shift();

       for (const d of direction) {
           let nx = x + d[0];
           let ny = y + d[1];
           let nl = l + d[2];

           if (nx < 0 || ny < 0 || nl < 0 || nx >= C || ny >= R || nl >= L) continue;

           if (map[nl][ny][nx] !== '#') {
               if (map[nl][ny][nx] === 'E') return `Escaped in ${cnt + 1} minute(s).`;
               map[nl][ny][nx] = '#';
               queue.push([nl, ny, nx, cnt + 1]);
           }
       }
   }

   return 'Trapped!';
}

✏️ 결과코드


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

let direction = [
   [1, 0, 0],
   [-1, 0, 0],
   [0, 1, 0],
   [0, -1, 0],
   [0, 0, 1],
   [0, 0, -1],
];

function bfs(tmp_q, map, L, R, C) {
   let queue = [tmp_q];
   map[queue[0][0]][queue[0][1]][queue[0][2]] = '#';

   while (queue.length) {
       let [l, y, x, cnt] = queue.shift();

       for (const d of direction) {
           let nx = x + d[0];
           let ny = y + d[1];
           let nl = l + d[2];

           if (nx < 0 || ny < 0 || nl < 0 || nx >= C || ny >= R || nl >= L) continue;

           if (map[nl][ny][nx] !== '#') {
               if (map[nl][ny][nx] === 'E') return `Escaped in ${cnt + 1} minute(s).`;
               map[nl][ny][nx] = '#';
               queue.push([nl, ny, nx, cnt + 1]);
           }
       }
   }

   return 'Trapped!';
}

function findStart(map, L, R, C) {
   for (let l = 0; l < L; l++) {
       for (let r = 0; r < R; r++) {
           for (let c = 0; c < C; c++) {
               if (map[l][r][c] === 'S') return [l, r, c, 0];
           }
       }
   }
}

let ans = [];

while (true) {
   let [L, R, C] = input.shift().trim().split(' ').map(Number);

   if (L === 0) break;

   let map = [];

   for (let i = 0; i < L; i++) {
       let row = [];
       for (let j = 0; j < R; j++) {
           row.push(input.shift().trim().split(''));
       }
       map.push(row);
       input.shift();
   }

   ans.push(bfs(findStart(map, L, R, C), map, L, R, C));
}

console.log(ans.join('\n'));
profile
안녕하세요 코린입니다!

0개의 댓글