[백준/14503] 로봇 청소기 - JavaScript

이상돈·2024년 3월 11일
post-thumbnail

문제분류 : 구현 + 시뮬레이션

난이도 : 골드 5

출처 : 백준 - 로봇 청소기

문제

제한사항

📌 내가 생각한 풀이

기존의 dfs를 이용한 이동방식에서 방향을 추가해주어 풀자.
또한 90도 회전이 있기 떄문에, 보고 있는 방향에서, 바로 갈 수 있도록, dx, dy배열을 추가하자.
let inputs = require("fs")
  .readFileSync("boj_14503_로봇 청소기.txt")
  .toString()
  .trim()
  .split("\n");

const changeDir = dir => {
  switch (dir) {
    case 0:
      return [
        [0, 1, 0, -1],
        [-1, 0, 1, 0],
        [3, 2, 1, 0],
      ];
    case 1:
      return [
        [-1, 0, 1, 0],
        [0, -1, 0, 1],
        [0, 3, 2, 1],
      ];
    case 2:
      return [
        [0, -1, 0, 1],
        [1, 0, -1, 0],
        [1, 0, 3, 2],
      ];
    case 3:
      return [
        [1, 0, -1, 0],
        [0, 1, 0, -1],
        [2, 1, 0, 3],
      ];
  }
};

const back = (x, y, dir) => {
  switch (dir) {
    case 0:
      return [x + 1, y];
    case 1:
      return [x, y - 1];
    case 2:
      return [x - 1, y];
    case 3:
      return [x, y + 1];
  }
};
function solution(input) {
  let [n, m] = input[0].split(" ").map(d => +d);
  let [x, y, d] = input[1].split(" ").map(d => +d);
  let count = 1;
  let visited = Array.from(Array(n), () => Array(m).fill(0));
  let board = [];
  for (var i = 2; i < 2 + n; i++) {
    board.push(input[i].split(" ").map(d => +d));
  }
  let queue = [[x, y, d]];
  while (queue.length) {
    let [cX, cY, cD] = queue.shift();
    let [dx, dy, cdArr] = changeDir(cD);
    visited[cX][cY] = 1;

    let isVacuum = false;
    for (var k = 0; k < 4; k++) {
      let lX = cX + dx[k];
      let lY = cY + dy[k];
      if (lX >= 0 && lY >= 0 && lX < n && lY < m) {
        if (!visited[lX][lY] && board[lX][lY] !== 1) {
          isVacuum = true;
          count++;
          queue.push([lX, lY, cdArr[k]]);
          break;
        }
      }
    }
    if (!isVacuum) {
      let [nX, nY] = back(cX, cY, cD);
      if (board[nX][nY] === 1) break;
      queue.push([nX, nY, cD]);
    }
  }

  console.log(count);
}
solution(inputs);

📌 느낀점

방향까지 배열에 담아 푸는 구현, 시뮬레이션 문제였다. 또한, 회전이라는 함수를 따로 두지 않고, 보고있는 방향에 따른 dx, dy값을 변형시켜 바로 이동할 수 있도록 만들었다.

profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글