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'));