
내가 작성한 코드
class Solution {
public int solution(int[][] board) {
// 이중 for문을 돌면서 지뢰(1)인 칸을 찾아 폭발(2)로 변경
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (board[i][j] == 1) {
explodeAround(board, i, j);
}
}
}
int answer = 0;
// 폭발(2)되지 않은 칸만 카운트
for (int[] row : board) {
for (int cell : row) {
if (cell == 0) {
answer++;
}
}
}
return answer;
}
// 주변 8개의 칸을 폭발(2)로 변경하는 메서드
public void explodeAround(int[][] board, int i, int j) {
// 주변 8개의 칸을 탐색
for (int x = -1; x <= 1; x++) { // 행 방향 (-1: 위쪽, 0: 현재, 1: 아래쪽)
for (int y = -1; y <= 1; y++) { // 열 방향 (-1: 왼쪽, 0: 현재, 1: 오른쪽)
int ni = i + x; // 새로운 행 인덱스
int nj = j + y; // 새로운 열 인덱스
// 현재 위치 (i, j)는 1
if (x == 0 && y == 0) {
continue;
}
// 유효한 좌표인지 확인 (배열 범위 체크)
if (ni >= 0 && ni < board.length && nj >= 0 && nj < board[ni].length) {
// 이미 지뢰(1)가 아닌 경우만 폭발(2)로 변경
if (board[ni][nj] != 1) {
board[ni][nj] = 2;
}
}
}
}
}
}
다른 사람의 코드
class Solution {
public int solution(int[][] board) {
int answer = 0;
int length = board.length; //길이
int[][] temp = new int[length+2][length+2];
// 길이를 2 늘린 액자용 배열 생성 -> 이러면 단순한 조건식으로 안전영역 구할 수 있음
// 액자에 board 이식.
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
temp[i][j]=board[i-1][j-1];
}
}
//위험지대 찾기
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
if(temp[i][j]==1){
for(int a = i-1; a<=i+1; a++){
for(int b =j-1; b<=j+1; b++){
if(temp[a][b]!=1) temp[a][b]=2;
}
}
}
}
}
// 안전지대 카운트
for(int i=1; i<length+1; i++){
for(int j=1; j<length+1;j++){
if(temp[i][j]==0) answer++;
System.out.print(temp[i][j]);
}
System.out.println("");
}
return answer;
}
}
나는 조건문을 두어 배열 밖의 변경 예외를 처리했지만
해당 코드에서는 크기를 키운 배열을 새로 생성한 후 이식하는 것으로 처리
Share article