백준 1987번 JavaScript

yj j·2024년 1월 24일

백준 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 배열을 생성합니다.

다음칸에 도달할 때마다 상,하,좌,우를 확인해서 중복되지 않은 칸을 확인합니다.

profile
꿈꾸는 사람

0개의 댓글