다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
풀이1) 중간 / 끝 / 모서리 나눠서 풀이
class Solution {
public int solution(int[][] board) {
int answer = 0;
//중간부분
for(int i=1; i<board.length-1;i++){
for(int j=1; j<board[i].length-1; j++){
if(board[i][j]==1){
for(int x=i-1;x<=i+1;x++){
for(int y=j-1;y<=j+1;y++){
if(board[x][y]!=1){
board[x][y]=2;
}
}
}
}
}
}
//모서리
for(int i=1; i<board.length-1;i++){
if(board[0][i]==1){
for(int x=i-1;x<=i+1;x++){
for(int y=0;y<=1;y++){
if(board[x][y]!=1){
board[x][y]=2;
}
}
}
}
if(board[i][0]==1){
for(int x=i-1;x<=i+1;x++){
for(int y=0;y<=1;y++){
if(board[x][y]!=1){
board[x][y]=2;
}
}
}
}
if(board[board.length-1][i]==1){
for(int x=board.length-2;x<=board.length-1;x++){
for(int y=i-1;y<=i+1;y++){
if(board[x][y]!=1){
board[x][y]=2;
}
}
}
}
if(board[i][board.length-1]==1){
for(int x=i-1;x<=i+1;x++){
for(int y=board.length-2;y<=board.length-1;y++){
if(board[x][y]!=1){
board[x][y]=2;
}
}
}
}
}
//꼭지점
if(board.length!=1){
if(board[0][0]==1){
for(int i=0; i<=1;i++){
for(int j=0; j<=1;j++){
if(board[i][j]!=1){
board[i][j]=2;
}
}
}
}
if(board[0][board.length-1]==1){
for(int i=0; i<=1;i++){
for(int j=board.length-2; j<=board.length-1;j++){
if(board[i][j]!=1){
board[i][j]=2;
}
}
}
}
if(board[board.length-1][0]==1){
for(int i=board.length-2; i<=board.length-1;i++){
for(int j=0; j<=1;j++){
if(board[i][j]!=1){
board[i][j]=2;
}
}
}
}
if(board[board.length-1][board.length-1]==1){
for(int i=board.length-2; i<=board.length-1;i++){
for(int j=board.length-2; j<=board.length-1;j++){
if(board[i][j]!=1){
board[i][j]=2;
}
}
}
}
}
for(int i=0; i<board.length;i++){
for(int j=0; j<board[i].length; j++){
if(board[i][j]==0) answer++;
}
}
return answer;
}
}
풀이2) 배열 2칸씩 늘린 배열에 복사하여 구하기
class Solution {
public int solution(int[][] board) {
int answer = 0;
int[][] temp = new int[board.length+2][board.length+2];
for(int i=1; i<temp.length-1; i++){
for(int j=1; j<temp.length-1;j++){
temp[i][j]=board[i-1][j-1];
}
}
//중간부분
for(int i=1; i<temp.length-1;i++){
for(int j=1; j<temp.length-1; j++){
if(temp[i][j]==1){
for(int x=i-1;x<=i+1;x++){
for(int y=j-1;y<=j+1;y++){
if(temp[x][y]!=1){
temp[x][y]=2;
}
}
}
}
}
}
for(int i=1; i<temp.length-1;i++){
for(int j=1; j<temp[i].length-1; j++){
if(temp[i][j]==0) answer++;
}
}
return answer;
}
}