[백준] 4396번 : 지뢰 찾기 (node.js)

Jo Chang Uk·2024년 5월 7일

1. 문제

문제 링크

2. 테스트 케이스 공유

문제에서 주어진 테스트 케이스는 지뢰를 안 밟은 케이스 입니다.
질문하기에서 올려준 지뢰를 밟은 테스트 케이스 공유(abcd8637님 감사합니다)
링크 https://www.acmicpc.net/board/view/68709

입력

8
...**..*
......*.
....*...
........
........
.....*..
...**.*.
.....*..
xxxx....
....xxxx
xxxx....
....xxxx
xxxx....
....xxxx
xxxx....
....xxxx

출력

001**..*
....33*2
0001*...
....1100
0000....
....3*21
001**.*.
....3*21

3. 풀이

3.1 생각해 볼 만한 케이스

  • 지뢰를 밟았을 때, 안 밟았을 때
  • 주위의 8칸 지뢰 여부 확인
  • 주위의 8칸을 확인할 때 판을 벗어난 경우
var fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

// input을 받아오는걸 잘 못합니다
const n = +input.shift(); // 8

// 끝난뒤 판
const doneBoard = input.filter((v, i) => i >= n).map((v) => v.split(""));

// 지뢰 위치 판
input = input.filter((v, i) => i < n).map((v) => v.split(""));

// 주위 8 곳을 확인하고 지뢰의 개수를 반환하는 함수
function check(i, j, board) {
  let dx = [-1, 0, 1, -1, 1, -1, 0, 1];
  let dy = [-1, -1, -1, 0, 0, 1, 1, 1];
  // 지뢰 개수
  let cnt = 0;
  for (let k = 0; k < 9; k++) {
    let x = i + dx[k];
    let y = j + dy[k];
    // 지뢰판을 벗어난 경우를 제외한뒤 지뢰일 경우 cnt++
    if (x >= 0 && y >= 0 && x < n && y < n && board[x][y] === "*") cnt++;
  }
  return cnt;
}

function solution(n, board, doneBoard) {
  // 지뢰를 밟았을때와 아닐때 출력이 다르므로 변수를 만들었습니다.
  let isTrap = false;
  // 지뢰를 밟은 판인지 확인하는 과정
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (doneBoard[i][j] === "x" && board[i][j] === "*") {
        isTrap = true;
        // 밟으면 종료
        break;
      }
    }
  }

  if (isTrap) {
    // 지뢰 밟았을때 출력 과정
    for (let i = 0; i < n; i++) {
      let answer = "";
      for (let j = 0; j < n; j++) {
        if (board[i][j] === "*") answer += board[i][j];
        else {
          if (doneBoard[i][j] === "x") answer += check(i, j, board);
          else {
            answer += ".";
          }
        }
      }
      console.log(answer);
    }
  } else {
    // 지뢰 안밟았을때 출력 과정
    for (let i = 0; i < n; i++) {
      let answer = "";
      for (let j = 0; j < n; j++) {
        if (doneBoard[i][j] === "x") answer += check(i, j, board);
        else answer += ".";
      }
      console.log(answer);
    }
  }
}

solution(n, input, doneBoard);

0개의 댓글