[알고리즘문제풀기] 안전지대

silver's avatar
Feb 10, 2025
[알고리즘문제풀기] 안전지대

문제

내가 작성한 오답

  1. i나 j가 0일 경우 k에 -1일경우 범위 오류 → ArrayIndexOutOfBoundsException 예외 발생!
  1. i나 j가 0일 경우 answer +=9가 아닌 6 또는 4가 된다.
  1. 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

silver