

기존의 dfs를 이용한 이동방식에서 방향을 추가해주어 풀자.
또한 90도 회전이 있기 떄문에, 보고 있는 방향에서, 바로 갈 수 있도록, dx, dy배열을 추가하자.
let inputs = require("fs")
.readFileSync("boj_14503_로봇 청소기.txt")
.toString()
.trim()
.split("\n");
const changeDir = dir => {
switch (dir) {
case 0:
return [
[0, 1, 0, -1],
[-1, 0, 1, 0],
[3, 2, 1, 0],
];
case 1:
return [
[-1, 0, 1, 0],
[0, -1, 0, 1],
[0, 3, 2, 1],
];
case 2:
return [
[0, -1, 0, 1],
[1, 0, -1, 0],
[1, 0, 3, 2],
];
case 3:
return [
[1, 0, -1, 0],
[0, 1, 0, -1],
[2, 1, 0, 3],
];
}
};
const back = (x, y, dir) => {
switch (dir) {
case 0:
return [x + 1, y];
case 1:
return [x, y - 1];
case 2:
return [x - 1, y];
case 3:
return [x, y + 1];
}
};
function solution(input) {
let [n, m] = input[0].split(" ").map(d => +d);
let [x, y, d] = input[1].split(" ").map(d => +d);
let count = 1;
let visited = Array.from(Array(n), () => Array(m).fill(0));
let board = [];
for (var i = 2; i < 2 + n; i++) {
board.push(input[i].split(" ").map(d => +d));
}
let queue = [[x, y, d]];
while (queue.length) {
let [cX, cY, cD] = queue.shift();
let [dx, dy, cdArr] = changeDir(cD);
visited[cX][cY] = 1;
let isVacuum = false;
for (var k = 0; k < 4; k++) {
let lX = cX + dx[k];
let lY = cY + dy[k];
if (lX >= 0 && lY >= 0 && lX < n && lY < m) {
if (!visited[lX][lY] && board[lX][lY] !== 1) {
isVacuum = true;
count++;
queue.push([lX, lY, cdArr[k]]);
break;
}
}
}
if (!isVacuum) {
let [nX, nY] = back(cX, cY, cD);
if (board[nX][nY] === 1) break;
queue.push([nX, nY, cD]);
}
}
console.log(count);
}
solution(inputs);
방향까지 배열에 담아 푸는 구현, 시뮬레이션 문제였다. 또한, 회전이라는 함수를 따로 두지 않고, 보고있는 방향에 따른 dx, dy값을 변형시켜 바로 이동할 수 있도록 만들었다.