[백준 17070] 파이프 옮기기 1 with node.js

waterglasses·2021년 12월 29일
0
post-thumbnail

📌 문제

https://www.acmicpc.net/problem/17070

📌 풀이

  • 파이프의 끝 부분을 좌표로 계산해 나가면 어렵지 않은 문제이다.
  • dx, dy로 끝 부분을 정해놓고 계산하면서 예외 조건들(벽이거나 가로에서 세로, 세로에서 가로로 이동할 수 없다는 경우 등)을 만났을 때 continue를 해주면 된다.

📌 코드

const fs = require('fs');
const stdin = (
  process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString().trim()
    : `3
0 0 0
0 0 0
0 0 0`
).split('\n');

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

const countWaysToMovePipe = (x, y, pipe) => {
  if (x === N - 1 && y === N - 1) {
    cntOfWaysToMovePipe += 1;
    return;
  }

  for (let i = 0; i < 3; i++) {
    let nx = x + dx[i];
    let ny = y + dy[i];

    let isMoveEachHorizontalAndVertical = (i === 0 && pipe === 1) || (i === 1 && pipe === 0);
    if (isMoveEachHorizontalAndVertical) {
      continue;
    }

    let isOutOfIdxOrIsWall = nx >= N || ny >= N || house[nx][ny];
    if (isOutOfIdxOrIsWall) {
      continue;
    }

    let ifPipeIsDiagonal = i === 2 && (house[x][y + 1] || house[x + 1][y]);
    if (ifPipeIsDiagonal) {
      continue;
    }

    countWaysToMovePipe(nx, ny, i);
  }
};

const N = parseInt(input());
const house = Array.from(new Array(N), () => input().split(' ').map(Number));
const dx = [0, 1, 1];
const dy = [1, 0, 1];

let cntOfWaysToMovePipe = 0;
countWaysToMovePipe(0, 1, 0);

console.log(cntOfWaysToMovePipe);
profile
매 순간 성장하는 개발자가 되려고 노력하고 있습니다.

0개의 댓글