Leetcode Java Minesweeper

업데이트:

문제

Link

코드

class Solution {

  public char[][] updateBoard(char[][] board, int[] click) {
    int x = click[0];
    int y = click[1];
    if (board[x][y] == 'M') {
      board[x][y] = 'X';
    } else {
      this.dfs(board, x, y, board.length, board[0].length);
    }
    return board;
  }

  private void dfs(char[][] board, int x, int y, int rowLength, int colLength) {
    if (x < 0 || y < 0 || x >= rowLength || y >= colLength || board[x][y] != 'E') {
      return;
    }
    int num = this.findMines(board, x, y, rowLength, colLength);
    if (num == 0) {
      board[x][y] = 'B';
      for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
          this.dfs(board, x + i, y + j, rowLength, colLength);
        }
      }
    } else {
      board[x][y] = (char) ('0' + num);
    }
  }

  private int findMines(char[][] board, int x, int y, int rowLength, int colLength) {
    int count = 0;
    for (int i = -1; i <= 1; i++) {
      for (int j = -1; j <= 1; j++) {
        int x1 = x + i;
        int y1 = y + j;
        if (x1 >= 0 && y1 >= 0 && x1 < rowLength && y1 < colLength && board[x1][y1] == 'M') {
          count++;
        }
      }
    }
    return count;
  }

}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(w);
 * int param_1 = obj.pickIndex();
 */

결과

Link

설명

  1. board 크기의 지뢰찾기 게임을 하는 중 click한 위치부터 시작해서 지뢰를 모두 찾을 때 까지 단계를 반복하여 board를 반환하는 문제이다.
    • ‘M’은 미공개 지뢰를 의미한다.
    • ‘E’는 드러나지 않은 셀을 의미한다.
    • ‘B’는 인접한 지뢰가 없는 빈 셀을 의미한다.
    • ‘X’는 드러난 지뢰를 의미한다.
  2. 클릭한 위치가 지뢰인 경우 지뢰를 클릭했으므로, 해당 위치를 ‘X’로 변경하고 board를 반환한다.

  3. 클릭한 위치가 지뢰가 아닌 경우, 4번에서 정의한 dfs(char[][] board, int x, int y, int rowLength, int colLength) 메서드를 수행한다.

  4. DFS 방식으로 지뢰를 찾기 위한 dfs(char[][] board, int x, int y, int rowLength, int colLength) 메서드를 정의한다.
    • x가 배열의 x축 범위를 벗어나거나, y가 y축 범위를 벗어나면 수행을 종료한다.
    • num에 5번에서 인접한 지뢰의 개수를 찾기 위한 findMines(char[][] board, int x, int y, int rowLength, int colLength) 메서드를 수행한 결과를 반환한다.
    • num이 0이면 지뢰가 없으므로, board[x][y]에 ‘B’를 넣어주고, x와 y 인접 셀을 재귀 호출을 이용하여 탐색한다.
    • num이 0이 아니면 board[x][y]에 인접한 지뢰의 개수를 넣어준다.
  5. 지뢰의 개수를 탐색하기 위한 findMines(char[][] board, int x, int y, int rowLength, int colLength) 메서드를 정의한다.
    • 지뢰의 개수를 넣을 count를 0으로 정의한다.
    • x와 y축을 1씩 가감하며 ‘M’의 개수를 찾아 count를 증가시키고 해당 값을 반환한다.
  6. 4 ~ 5번의 수행이 완료되면 지뢰찾기 게임을 완성한 board를 주어진 문제의 결과로 반환한다.

소스

Sample Code는 여기에서 확인 가능합니다.

댓글남기기