https://school.programmers.co.kr/learn/courses/30/lessons/120866
- 노가다 - 실패
- map에 옮겨담은 후 1인원소 찾아내서 그 주변과 본인 모두 value++한다.
그 뒤 0인것만 찾아 answer++하기
-> 끝자리에 걸치는 것들 처리하는데 문제, 굳이 맵을?- 2차원 array로 구현하기
-> n+2 * n+2 의 범위의 2차원 array를 만들어두고 1 ~ n 범위만 쓴다.
board를 arr1의 1~n범위에 옮긴 후 arr1을 검사하면서 1인 원소의 주변과 해당 원소를 1로 만드는데 그냥 arr1에서 하면 1을만나서 주변을 1이나 다른 원소로했을 때 다른 지뢰가 사라지거나 0인부분이 1이되어 지뢰로 될 수 있으므로 arr2를 추가하여 arr2에 적용시켜준다. 끝나면 arr2의 1~n범위에서 0인 부분만 ++해준다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board) {
int answer = 0;
int n = board[0].size();
int arr1[n + 2][n + 2];
int arr2[n + 2][n + 2];
for(int i = 0; i < n + 2; i++)
for(int j = 0; j < n + 2; j++)
arr1[i][j] = 0;
for(int i = 0; i < n + 2; i++)
for(int j = 0; j < n + 2; j++)
arr2[i][j] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
arr1[i][j] = board[i-1][j-1];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(arr1[i][j] == 1)
{
arr2[i-1][j-1] = 1;
arr2[i-1][j] = 1;
arr2[i-1][j+1] = 1;
arr2[i][j-1] = 1;
arr2[i][j] = 1;
arr2[i][j+1] = 1;
arr2[i+1][j-1] = 1;
arr2[i+1][j] = 1;
arr2[i+1][j+1] = 1;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(arr2[i][j] == 0)
answer++;
return answer;
}
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board) {
int answer = 0;
const int n = board.size();
const int m = board[0].size();
vector<vector<int>> offset{{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
bool passed = true;
for(const auto& v : offset)
{
int ni = i + v[0];
int nj = j + v[1];
if(ni >= 0 && ni < n && nj >= 0 && nj < m)
{
if(board[ni][nj] == 1)
{
passed = false;
break;
}
}
}
answer += passed;
}
}
return answer;
}
1을 찾아서 주변을 1로 만들기 보다 모든 원소에 대해 주변에 1이 있는지 검사 후 없으면 answer ++ 한다.