[JAVA 문제 풀이] 73. 안전지대

프로그래머스 (120866)
Stupefyee's avatar
Feb 05, 2025
[JAVA 문제 풀이] 73. 안전지대
notion image

내가 작성한 코드

💡
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

stupefyee