만약 ["SSS", "SSS", "SSS"]
인 경우가 있다면 답은 [3,3,3,3,3,3,3,3,3,3,3,3]
가 되어야한다.
하지만 나의 방식대로 풀어보면 [3,3,3,3]
이 나온다.
(1, 1)에 위치한 알파벳에서 시작하는 경우만 생각했기 때문이다.
grid
와 grid
의 각 문자열의 길이는 최대 500이므로, 나는 최대 250000번 반복문을 실행해야 한다.
당연히 시간초과가 날 것이기 때문에 다른 방식을 생각해보았다.
function solution(grid) {
const direction = [
{ x: 1, y: 0 },
{ x: 0, y: 1 },
{ x: -1, y: 0 },
{ x: 0, y: -1 },
];
function createBoard(grid) {
const board =[];
for (let x = 0; x < grid.length; x++) {
board.push([]);
for (let y = 0; y < grid[0].length; y++) {
board[x].push(new Array(4).fill(true));
}
}
return board;
}
function recordRoute(xi, yi, ri) {
let total = 0;
while (true) {
if (!board[xi][yi][ri]) break;
board[xi][yi][ri] = false;
total += 1;
xi += direction[ri].x;
yi += direction[ri].y;
if (xi < 0) xi = board.length - 1;
if (xi >= board.length) xi = 0;
if (yi < 0) yi = board[0].length - 1;
if (yi >= board[0].length) yi = 0;
if (grid[xi][yi] === 'R') ri = [3, 0, 1, 2][ri];
if (grid[xi][yi] === 'L') ri = [1, 2, 3, 0][ri];
}
return total;
}
const totalList = [];
const board = createBoard(grid);
board.forEach((x, xi) => {
x.forEach((y, yi) => {
y.forEach((route, ri) => {
if (route) {
totalList.push(recordRoute(xi, yi, ri));
}
});
});
});
return totalList.sort((a, b) => a - b);
}
grid
에 상하좌우 배열을 삽입하였다. true
에서 false
로 바꿨다. false
인지 아닌지 판별하였다. 이렇게 코드를 작성하니 코드의 길이도 짧아지고 모든 grid
를 방문하여 빛을 순환할 필요도 없어졌다.