#
문제 설명
1 x 1 크기의 칸들로 이루어진
직사각형 격자 형태의 미로에서 최대한 빠르게 탈출
조건
통로
또는 벽
으로 구성벽으로 된 칸
은 지나가기 불가능통로로 된 칸
으로만 이동 가능 빠져나가는 문
존재 레버
또한 통로들 중 한 칸에 존재매개 변수
maps
반환값
maps | result |
---|---|
["SOOOL","XXXXO","OOOOO","OXXXX","OOOOE"] | 16 |
["LOOXS","OOOOX","OOOOO","OOOOO","EOOOO"] | -1 |
function solution(maps) {
let start = [];
let lever = [];
const _maps = [[], []];
for(let i=0; i<maps.length; i++) {
_maps[0].push([]);
_maps[1].push([]);
for(let j=0; j<maps[i].length; j++) {
_maps[0][i].push(maps[i][j]);
_maps[1][i].push(maps[i][j]);
if(maps[i][j] === "S") start = [i,j];
else if(maps[i][j] === "L") lever = [i,j]
}
}
const a = bfs(start, [..._maps[0]], "L");
const b = bfs(lever, [..._maps[1]], "E");
if(a === -1 || b === -1) return -1
return a+b;
}
function bfs(start, arr, target) {
let time = 0;
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
const [n, m] = [arr.length, arr[0].length]
const q = [start];
arr[start[0]][start[1]] = 'X';
while(q.length > 0) {
const size = q.length;
for(let i=0; i<size; i++) {
const [x, y] = q.shift();
for(let j=0; j<4; j++) {
const nx = x + dx[j];
const ny = y + dy[j];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && arr[nx][ny] !== 'X') {
if(arr[nx][ny] === target) {
return time+1;
}
q.push([nx, ny]);
arr[nx][ny] = 'X';
}
}
}
time++;
}
return -1;
}
풀이
BFS 완전 탐색을 통해 solution 구하기
- _maps[0] 과 _maps[1] 는
배열 참조
문제 때문에 각각 선언- 함수 내부에서 수정한 내용도 코드에서 배열을 수정하여 방문한 위치를 표시
- lever 와 start 의 좌표 구하기
- while 한 번 반복당 time++
- L 이 target 일 때, E 가 target 일 때
각각 최단거리 구하기- 지나간 경로는 'X'
- 동서남북으로 이동하여 조건 상 맞으면 q.push()