백준 1987번 node.js
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const [r, c] = input[0].split(" ").map(Number);
//알파벳으로 방문 처리
const visited = new Array(26).fill(false);
const board = [];
for (let i = 1; i <= r; i += 1) {
board.push(input[i]);
}
//상,하,좌,우로 x,y 좌표 이동
const dx = [0, 0, -1, 1];
const dy = [-1, 1, 0, 0];
let maxDepth = 0;
//알파벳 문자열을 아스키코드로 변환
const translateASCII = (alphabet) => alphabet.charCodeAt() - 65;
const dfs = (depth, x, y) => {
maxDepth = Math.max(depth, maxDepth); //최대 깊이
for (let i = 0; i < 4; i += 1) {
const nx = dx[i] + x;
const ny = dy[i] + y;
if (nx < 0 || nx >= r || ny < 0 || ny >= c) continue; //맵 벗어날때
if (visited[translateASCII(board[nx][ny])]) continue; //
visited[translateASCII(board[nx][ny])] = true;
dfs(depth + 1, nx, ny);
visited[translateASCII(board[nx][ny])] = false;
}
};
visited[translateASCII(board[0][0])] = true;
dfs(1, 0, 0);
console.log(maxDepth);
Set에 담아서 지나온 칸에 있는지를 비교하려고 했는데 시간초과가 떠서 다른 방법을 찾아보았습니다.
알파벳 문자열을 아스키코드로 변환해서 방문처리 배열의 인덱스로 사용합니다. A부터 Z까지는 아스키코드 65부터 90이므로, 65를 빼서 0-25의 인덱스를 가지는 visited 배열을 생성합니다.
다음칸에 도달할 때마다 상,하,좌,우를 확인해서 중복되지 않은 칸을 확인합니다.