본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 2589 보물섬 (Javascript)

by Cafe Mocha 2023. 1. 30.

2589번: 보물섬 (acmicpc.net)

 

2589번: 보물섬

첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의

www.acmicpc.net


알고리즘 : 완전탐색,bfs

 

let input = require("fs")
  .readFileSync("input.txt") //"/dev/stdin"
  .toString()
  .split("\n")
  .map((val) => val.trim());

let [n, m] = input
  .shift()
  .split(" ")
  .map((v) => +v);

let graph = input.map((v) => v.split(""));

let dx = [0, 1, 0, -1];
let dy = [1, 0, -1, 0];
const bfs = (x, y, vis) => {
  let queue = [];
  vis[x][y] = 0;

  queue.push([x, y]);
  while (queue.length) {
    let [cx, cy] = queue.shift();
    for (let dir = 0; dir < 4; dir++) {
      let nx = cx + dx[dir];
      let ny = cy + dy[dir];
      if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
      if (vis[nx][ny] !== -1 || graph[nx][ny] === "W") continue;
      vis[nx][ny] = vis[cx][cy] + 1;
      queue.push([nx, ny]);
    }
  }
  return Math.max(...vis.flat());
};
function solution() {
  // 최단거리 ->bfs

  let ans = 0;
  // 완전탐색 -> 가장 먼 값 기억 -> 최단거리는 bfs자체에서 해결
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      if (graph[i][j] === "L") {
        let vis = new Array(n).fill().map((v) => new Array(m).fill(-1));
        let temp = bfs(i, j, vis);
        ans = Math.max(ans, temp);
      }
    }
  }

  console.log(ans);
}

solution();