새소식

Baekjoon

[BaekJoon] 3190 번 뱀 문제 - (nodejs)

  • -
728x90

 

문제 번호 :  3190번

문제 바로가기 https://www.acmicpc.net/problem/3190

 

<<< 문제 내용 >>>



 

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

const boardLen = Number(input.shift());

// 뱀 = S , 길 = 0 , 사과 = A
let board = Array.from(Array(boardLen), () => new Array(boardLen).fill(0));

const appleLen = Number(input.shift());

for (let i = 0; i < appleLen; i++) {
  let temp = input[0].split(" ").map(Number);
  input.shift();

  board[temp[0] - 1][temp[1] - 1] = "A";
}

const operLen = Number(input.shift());

let operArr = [];

for (let i = 0; i < operLen; i++) {
  let temp = input[0].split(" ");
  input.shift();

  operArr.push([Number(temp[0]), temp[1]]);
}

board[0][0] = "S";
const dy = [-1, 1, 0, 0];
const dx = [0, 0, -1, 1];
let snakeDir = 3; //0~3 상하좌우
let [cy, cx] = [0, 0];
let cnt = 0;

let sLocation = [[0, 0]];

const dirConvert = (curDir, turnWhere) => {
  switch (curDir) {
    case 0:
      if (turnWhere === "D") return 3;
      else return 2;
    case 1:
      if (turnWhere === "D") return 2;
      else return 3;
    case 2:
      if (turnWhere === "D") return 0;
      else return 1;
    case 3:
      if (turnWhere === "D") return 1;
      else return 0;
  }
};

while (true) {
  // 이동 1, 벽이나 자기 몸이면 종료
  // 사과인지 아닌지 판단, 사과면 꼬리는 삭제 x
  // 사과가 아니면 꼬리 삭제 o
  // 방향 변화있는지 확인하고 바꿔주기
  cnt++;

  const ny = cy + dy[snakeDir];
  const nx = cx + dx[snakeDir];

  if (
    ny < 0 ||
    ny >= boardLen ||
    nx < 0 ||
    nx >= boardLen ||
    board[ny][nx] === "S"
  )
    break;

  if (board[ny][nx] === 0) {
    board[ny][nx] = "S";
    [cy, cx] = sLocation.shift();
    board[cy][cx] = 0;
  } else if (board[ny][nx] === "A") {
    board[ny][nx] = "S";
  }

  // 뱀 바뀐 위치 추가
  sLocation.push([ny, nx]);

  // 방향 전환
  if (operArr.length && cnt === operArr[0][0]) {
    let oper = operArr.shift();
    snakeDir = dirConvert(snakeDir, oper[1]);
  }

  cy = ny;
  cx = nx;
}

console.log(cnt);

* 구현 문제이고, 주어진 조건을 차례차례 구현하다보니 코드가 다소 길어지긴 했으나,

속도는 준수하고, 데이터 양도 똑같긴하다. 대부분의 사람들의 코드보다 살짝 짧거나 비슷한데,

방향 전환을 나머지를 이용해서 간결하게 구현하거나, 각 조건들을 if else 등을 간략화해서 정답을 도출해낸 사람도 더러 있었다.

이런 분들은 구현에 통달 한 것인가.. 아니면 작성 후 코드를 리팩토링을 한 것인가..

 

아무튼 구현자체는 주어진 조건을 차례차례 구현하면 큰 문제 없는 문제였다.

 

 

 

도움이 되셨다면 공감 부탁드립니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.