1. 문제

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.


제한사항
  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

 

입출력 예boardresult
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 0

 

2. 코드

더보기
#include <string>
#include <vector>
using namespace std;

int solution(vector<vector<int>> board) {
    int answer = 0;
    int SIZE_Danger = board.size() + 2;
    int SIZE = board.size();
    // 위험하면 1
    vector<vector<bool>> danger(SIZE_Danger, vector<bool>(SIZE_Danger, false));
    int y = 0;
    int x = 0;
    unsigned int num = (SIZE_Danger * SIZE_Danger) - (SIZE * SIZE);


    // 지뢰 찾기
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (board[i][j] == 1)
            {
                y = i + 1;
                x = j + 1;
                danger[y - 1][x - 1] = true;
                danger[y - 1][x] = true;
                danger[y - 1][x + 1] = true;
                danger[y][x - 1] = true;
                danger[y][x] = true;
                danger[y][x + 1] = true;
                danger[y + 1][x - 1] = true;
                danger[y + 1][x] = true;
                danger[y + 1][x + 1] = true;
            }
        }

    }

    for (int i = 1; i < SIZE_Danger - 1; i++)
    {
        for (int j = 1; j < SIZE_Danger - 1; j++)
        {
            if (danger[i][j] == false)
                answer++;
        }
    }
    return answer;
}

 

3. 분석

지뢰가 있는 주변 3x3 크기의 지역은 모두 위험지역이다.

즉, 지뢰의 8방을 모두 위험지역으로 표시하면 된다.

그러나 지뢰가 보드의 구석에 위치한다면 위험지역이 4개 또는 6개 또는 9개 이므로 복잡해진다.

따라서 지뢰의 위험지역을 체크하는 이중벡터를 만들고 크기를 n + 2로 설정한다.

폭탄이 board의 모서리에 위치
확장된 danger의 크기

board 기준으로 상하좌우에 한 줄이 새로 생겼으므로, board의 좌표가 ( j, i )이라면, danger의 좌표는 ( j+1, i+1 )이다.

마지막에 위험 지역을 순회할 때 이 것을 유의하여 답을 작성한다.