😈 알고리즘/🖥️ 프로그래머스
🖥️ 안전지대
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++을 해주면 된다.