Buᐢ༝ᐢy 2023. 3. 3. 18:00

코딩테스트 연습 - 안전지대

문제 설명


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

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

제한사항


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

입출력 예


board result

[[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

입출력 예 설명


입출력 예 #1

  • (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

입출력 예 #2

  • (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

입출력 예 #3

  • 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.

제출 코드


2023년 2월 3일

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board) {
    int answer = 0;
    int length = board.size();
    int cx[] = {0, 1, 0, -1, 1, 1, -1, -1};
    int cy[] = {1, 0, -1, 0, 1, -1, -1, 1};

    for(int x = 0; x < length; x++)
    {
        for(int y = 0; y < length; y++)
        {
            if(board[x][y] == 1)
            {
                for(int i = 0; i < 8; i++)
                {
                    if(x + cx[i] >= 0 && x + cx[i] < length && y + cy[i] >= 0 && y + cy[i] < length)
                        if(board[x + cx[i]][y + cy[i]] != 1)
                            board[x + cx[i]][y + cy[i]] = -1;
                }
            }
        }
    }

    for(int x = 0; x < length; x++)
    {
        for(int y = 0; y < length; y++)
        {
            if(board[x][y] == 0)
                answer++;
        }
    }

    return answer;
}

범위만 구하면 되는 문제라 그리 어렵지 않다. 다만 처음에 풀 때 어떻게 접근할 지에 대해 생각을 많이 해야 했다.

2차원에서 0, 0에 폭탄이 놓여진다고 가정했을 때, 폭탄 주변인 상하좌우와 각 대각선들이 위험지역이 된다. 그림으로 보면 이해하기가 더 쉽다.

그 이후에 for문을 통해 어디 좌표에 폭탄이 있는지 확인한 후 cx, cy를 통해 위험 지역을 설정해주면 된다. 그리고 마지막으로 안전지대를 찾은 후 answer++을 해주면 된다.