문제
내가 작성한 오답
- i나 j가 0일 경우 k에 -1일경우 범위 오류 → ArrayIndexOutOfBoundsException 예외 발생!
- i나 j가 0일 경우 answer +=9가 아닌 6 또는 4가 된다.
- i나 j가 0일 경우 for(int k …)에서 +=2가 된다.
→ 이 경우를 다 if로 하면 풀이가 너무 길어진다.
class Solution {
public int solution(int[][] board) {
int answer = 0;
int len = board.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (board[i][j] == 1) {
answer += 9;
for (int k = -1; k <= 1; k++) {
if(board[i][j + k]==1){
answer += 3;
}
if(board[i + k][j]==1){
answer +=3;
}
}
}
}
}
return len*len - answer;
}
}
gpt가 수정해 준 정답
class Solution {
public int solution(int[][] board) {
int n = board.length;
boolean[][] dangerZone = new boolean[n][n];
// 8방향 탐색을 위한 배열 (위, 아래, 좌, 우, 대각선)
int[] dx = {-1, -1, -1, 0, 1, 1, 1, 0};
int[] dy = {-1, 0, 1, 1, 1, 0, -1, -1};
// 지뢰(1) 위치 찾기 & 위험지역 표시
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 1) { // 지뢰 발견
dangerZone[i][j] = true; // 지뢰 자체도 위험지역
// 8방향 탐색
for (int d = 0; d < 8; d++) {
int nx = i + dx[d];
int ny = j + dy[d];
if (nx >= 0 && nx < n && ny >= 0 && ny < n) { // 범위 체크
dangerZone[nx][ny] = true;
}
}
}
}
}
// 안전한 지역 개수 세기
int safeCount = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!dangerZone[i][j]) { // 위험지역이 아닌 경우
safeCount++;
}
}
}
return safeCount;
}
}
다른 사람들의 정답
class Solution {
public int solution(int[][] board) {
int answer = 0;
int length = board.length;
int[][] temp = new int[length + 2][length + 2]; // 액자용 배열 생성 (2칸 더 넓게)
// 액자에 board 이식. (0행과 0열, length+1행과 length+1열은 기본적으로 0)
for (int i = 1; i < length + 1; i++) {
for (int j = 1; j < length + 1; j++) {
temp[i][j] = board[i - 1][j - 1]; // 주어진 board의 값을 temp 배열에 복사
}
}
// 위험지대 찾기
for (int i = 1; i < length + 1; i++) {
for (int j = 1; j < length + 1; j++) {
if (temp[i][j] == 1) { // 만약 현재 위치가 위험지역(1)이라면
// 8개의 방향(상하좌우 및 대각선) 탐색
for (int a = i - 1; a <= i + 1; a++) {
for (int b = j - 1; b <= j + 1; b++) {
// 위험지역이 아닌 곳을 위험지대(2)로 표시
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++; // 안전지대(0)의 개수를 세기
System.out.print(temp[i][j]); // temp 배열의 상태 출력
}
System.out.println(""); // 한 행의 출력을 마친 후 줄바꿈
}
return answer; // 최종적으로 안전지대의 개수 반환
}
}
public class Solution {
public int solution(int[][] param) {
int safeZone = 0; // 안전지역의 개수를 세기 위한 변수
// 위험지역 설정
for (int i = 0; i < param.length; i++) {
for (int j = 0; j < param.length; j++) {
// 만약 현재 위치가 위험지역(1)이라면
if (param[i][j] == 1)
setArea(param, i, j); // 위험지역 주변을 위험지대로 설정
}
}
// 안전지역 개수 세기
for (int i = 0; i < param.length; i++) {
for (int j = 0; j < param.length; j++) {
// 현재 위치가 안전지역(0)이라면
if (param[i][j] == 0)
safeZone++; // 안전지역 카운트 증가
}
}
return safeZone; // 최종적으로 안전지역의 개수 반환
}
// 위험지역 주변을 위험지대로 설정하는 메소드
void setArea(int[][] param, int x, int y) {
// 현재 위험지역 주변 3x3 영역 탐색
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
try {
// 현재 위치가 안전지역(0)이라면 위험지대(2)로 변경
if (param[x + i][y + j] == 0)
param[x + i][y + j] = 2;
} catch (Exception e) {
// 배열 경계를 벗어날 경우 예외 처리 (아무 동작도 하지 않음)
}
}
}
}
}
Share article