본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 1996 : 지뢰 찾기

반응형

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

 

1996번: 지뢰 찾기

첫째 줄에 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 줄에는 지뢰 찾기 map에 대한 정보가 주어지는데 '.' 또는 숫자로 이루어진 문자열이 들어온다. '.'는 지뢰가 없는 것이고 숫자는 지뢰가 있는 경

www.acmicpc.net

구현 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

정보가 들어올 한 변의 길이 n, 방향정보를 저장할 일차원 배열 dr과 dc, 정보가 주어질 이차원 배열 board, 정답을 출력할 이차원 배열 ans를 선언한 후 정보를 입력받습니다.

📔 풀이과정

조건에 따라 지뢰의 개수를 확인해 ans에 저장합니다. 이차원 for loop를 수행하면서 자신이 r행 c열이라고 가정했을 때 자신을 0행 0열 기준으로 잡고 dr, dc에 따라 다음과 같이 인접한 8칸의 좌표를 구해 ans[r][c]를 구합니다.

 

📔 정답출력

ans를 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;

int n;
int dr[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dc[] = {-1, 0, 1, -1, 1, -1, 0, 1};
char board[1001][1001], ans[1001][1001];

int main(){
  cin >> n;
  for(int i = 0; i < n; i++) cin >> board[i];

  for(int r = 0; r < n; r++){
    for(int c = 0; c < n; c++){

      if(board[r][c] != '.') { ans[r][c] = '*'; continue; }
      int cnt = 0;

      for(int i = 0; i < 8; i++){
        int nr = r + dr[i];
        int nc = c + dc[i];
        if(0 > nr || nr >= n || 0 > nc || nc >= n) continue;
        if(board[nr][nc] == '.') continue;
        cnt += board[nr][nc] - '0';
      }

      if(cnt >= 10) ans[r][c] = 'M';
      else ans[r][c] = cnt + '0';
    }
  }

  for(int i = 0; i < n; i++) cout << ans[i] << '\n';
}