코딩 테스트/백준

[Node.js] 17837_새로운 게임 2

58청춘 2024. 6. 26. 00:25
728x90

문제

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

 

 

풀이

이 문제는 조금 난이도 있는 구현인거 같다.

 

우선 각 칸마다 색상과 쌓여있는 말들을 저장할 방법에 대해 고민했다. 서칭을 하던 중 칸 하나의 요소에 객체로 color와 stack을 넣어줘 관리하는 방법을 찾았다.

 

이 문제를 풀며 어려운 점이 있었는데, 파란칸(2)과 보드의 영역을 나가는 동작의 경우 반대 방향으로 움직이는 동작의 구현이였다. 마지막까지 반대 방향으로 움직이는 로직에서 실수를 하며 시간을 소비했다....

 

코드

const input = require('fs')
  .readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt')
  .toString().trim().split('\n').map(e => e.split(' ').map(Number));

const [n, k] = input.shift();
const map = input.splice(0, n).map(e => e.map(el => { return { color: el, stack: [] } })); // 이렇게 사용할 수 있구만
const cars = input.map(([y, x, d], idx) => {
  map[y - 1][x - 1].stack.push(idx);
  return [y - 1, x - 1, d - 1];
});

const dir = [[0, 1], [0, -1], [-1, 0], [1, 0]];
const revDir = [1,0,3,2];
let answer = 1;
let flag = false;

while (answer <= 1000) {
  for (let i = 0; i < cars.length; i++){
    let [y, x, d] = cars[i];
    let nY = y + dir[d][0];
    let nX = x + dir[d][1];

    if (nY >= n || nY < 0 || nX >= n || nX < 0 || (nY >= 0 && nY < n && nX >= 0 && nX < n && map[nY][nX].color === 2)) {
      cars[i] = [y, x, revDir[d]];
      const bY = y + dir[revDir[d]][0];
      const bX = x + dir[revDir[d]][1];

      if (bY >= 0 && bY < n && bX >= 0 && bX < n && map[bY][bX].color !== 2) {
        i--;
      }
    }
    else if (map[nY][nX].color === 0) {
      const curPlace = map[y][x].stack.indexOf(i);
      const tower = map[y][x].stack.splice(curPlace);
      map[nY][nX].stack.push(...tower);
      tower.forEach(e => {
        cars[e][0] = nY;
        cars[e][1] = nX;
      });
      if (map[nY][nX].stack.length >= 4) {
        flag = true;
      }
    }
    else if (map[nY][nX].color === 1) {
      const curPlace = map[y][x].stack.indexOf(i);
      const tower = map[y][x].stack.splice(curPlace);
      const reverseTower = tower.reverse();
      map[nY][nX].stack.push(...reverseTower);
      tower.forEach(e => {
        cars[e][0] = nY;
        cars[e][1] = nX;
      });
      if (map[nY][nX].stack.length >= 4) {
        flag = true;
      }
    }
    if (flag) break;
  }
  if (flag) break;
  answer += 1;
}

console.log(answer > 1000 ? -1 : answer);
728x90