

2차원배열에 방향을 알려주는 'dir'을 넣어서 풀자. 또한 거울이 존재하는 곳은 방향이 바뀌므로 changedir함수에 넣어 값을 찾자.
let inputs = require("fs")
.readFileSync("거울.txt")
.toString()
.trim()
.split("\n");
const changeDir = dir => {
switch (dir) {
case "U":
return "R";
case "D":
return "L";
case "L":
return "D";
case "R":
return "U";
}
};
const makeDir = dir => {
let command;
let dirArr = [
[-1, 0],
[1, 0],
[0, -1],
[0, 1],
];
switch (dir) {
case "U":
command = dirArr[0];
break;
case "D":
command = dirArr[1];
break;
case "L":
command = dirArr[2];
break;
case "R":
command = dirArr[3];
break;
}
return command;
};
function solution(input) {
let [n, m] = input[0].split(" ").map(d => +d);
let board = [];
let idx = 1;
let obj = {};
let strArr = [];
for (var i = 1; i < 1 + n; i++) {
board.push(input[i].split(" ").map(d => +d));
}
// 오른쪽으로 쏘기
let str = "";
for (var i = 0; i < n; i++) {
let queue = [[i, 0, "R"]];
let str = `${i},-1,L`;
obj[str] = idx++;
while (queue.length) {
let [x, y, dir] = queue.shift();
dir = board[x][y] === 1 ? changeDir(dir) : dir;
let [dx, dy] = makeDir(dir);
let lx = x + dx;
let ly = y + dy;
if (lx < 0 || ly < 0 || lx >= n || ly >= m) {
strArr.push(`${lx},${ly},${dir}`);
break;
} else {
queue.push([lx, ly, dir]);
}
}
}
// 위쪽으로 쏘기
for (var i = 0; i < m; i++) {
let queue = [[n - 1, i, "U"]];
let str = `${n},${i},D`;
obj[str] = idx++;
while (queue.length) {
let [x, y, dir] = queue.shift();
dir = board[x][y] === 1 ? changeDir(dir) : dir;
let [dx, dy] = makeDir(dir);
let lx = x + dx;
let ly = y + dy;
if (lx < 0 || ly < 0 || lx >= n || ly >= m) {
strArr.push(`${lx},${ly},${dir}`);
// console.log(lx, ly, dir);
break;
} else {
queue.push([lx, ly, dir]);
}
}
}
// 왼쪽으로 쏘기
for (var i = n - 1; i >= 0; i--) {
let queue = [[i, m - 1, "L"]];
let str = `${i},${m},R`;
obj[str] = idx++;
while (queue.length) {
let [x, y, dir] = queue.shift();
dir = board[x][y] === 1 ? changeDir(dir) : dir;
let [dx, dy] = makeDir(dir);
let lx = x + dx;
let ly = y + dy;
if (lx < 0 || ly < 0 || lx >= n || ly >= m) {
strArr.push(`${lx},${ly},${dir}`);
break;
} else {
queue.push([lx, ly, dir]);
}
}
}
// 아래쪽으로 쏘기
for (var i = m - 1; i >= 0; i--) {
let queue = [[0, i, "D"]];
let str = `-1,${i},U`;
obj[str] = idx++;
while (queue.length) {
let [x, y, dir] = queue.shift();
dir = board[x][y] === 1 ? changeDir(dir) : dir;
let [dx, dy] = makeDir(dir);
let lx = x + dx;
let ly = y + dy;
if (lx < 0 || ly < 0 || lx >= n || ly >= m) {
strArr.push(`${lx},${ly},${dir}`);
break;
} else {
queue.push([lx, ly, dir]);
}
}
}
strArr = strArr.map(d => {
return obj[d];
});
console.log(strArr.join(" "));
}
solution(inputs);
방향성을 다루는 것이 조금 오래걸렸다. 프로그래머스에도 비슷한 유형의 문제가 있다. 지속적으로 풀면서 방향성을 넣는 유형에도 익숙해지자.