[Javascript] 백준 2210: 숫자판 점프

Simon·2023년 12월 15일
post-thumbnail

문제
5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.

숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.

입력
다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.

출력

첫째 줄에 만들 수 있는 수들의 개수를 출력한다.

정답코드

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const map = input.map((line) => line.split(" ").map(Number));
const dx = [0, 0, -1, 1];
const dy = [-1, 1, 0, 0];

const result = [];

const dfs = (x, y, Level, str) => {
  if (Level === 5) {
    result.push(str);
    return;
  } else {
    for (let k = 0; k < 4; k++) {
      let nx = x + dx[k];
      let ny = y + dy[k];
      if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
        dfs(nx, ny, Level + 1, str + map[nx][ny]);
      }
    }
  }
};

for (let i = 0; i < 5; i++) {
  for (let j = 0; j < 5; j++) {
    dfs(i, j, 0, map[i][j].toString());
  }
}

console.log([...new Set(result)].length);

문제풀이
주어진 숫자판에 칸 하나마다 시작점을 제외하고 5칸까지 가기 위해 Level 5지점에 닿을 때까지 탐색하여 초기 문자열에 다 더해주면서 result 배열에 push 해주었다. 그다음 서로 다른 여섯 자리 숫자의 개수를 구하기 위해 중복을 제거하는 Set 자료형을 사용하여 중복된 값들을 제거되게 하고 길이를 출력하였다.
유의점: dfs에 초기 문자열 값을 줘야 하므로 map[i][j].toString()을 해주었다.

profile
포기란 없습니다.

0개의 댓글