본문 바로가기

프로그래머스(Java)/Level 0

[프로그래머스] 안전지대

728x90

문제 풀이 힌트:

  1. 이중 for 문을 사용하여 보드의 각 위치 (i, j)에 있는 요소가 0인지 확인합니다. 그리고 인접한 모든 요소들이 0인지를 검사하여 모두 0일 때 해당 위치를 안전지대라고 할 수 있습니다.
  2. 이 힌트를 보러 오신 분들은 아마 인접한 요소들을 탐색하는 방법을 잘 모르기 때문일 것입니다. 예를 들어, (0, 0) 위치에서는 (0, 0), (0, 1), (1, 0), (1, 1)만 비교하면 되지만, (1, 1) 위치에서는 (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) 총 9개를 비교해야 하기 때문입니다.

안전한지를 확인하는 방법:

다른 사람들의 코드와 비교해보면 크게 3가지의 접근 방식이 있습니다.

  1. 정직하게 모든 경우의 조건을 세워서 해당 조건에 맞게 안전한지 확인하는 코드입니다. 모든 인접한 요소를 하나씩 확인하여 안전한지를 판단합니다.
  2. 배열의 크기를 row + 2와 col + 2인 새로운 배열을 만들어서 기존 배열의 요소들을 (1,1)부터 (row, col)까지 복사하는 방법입니다. 이렇게 하면 기존의 (0, 0)이 새로운 배열의 (1, 1)이 되어 경계 조건을 처리하기가 더 쉬워집니다.
  3. try-catch를 활용하는 방법입니다. 배열의 인덱스가 범위를 벗어날 경우를 예외로 처리하여, 경계 조건을 간단하게 처리할 수 있습니다.

여러가지 방법이 있으니 문제를 푸시면 꼭 다른 사람 코드를 확인해주시면 좋을 것 같습니다

 


정답은 더보기 클릭

더보기

Try-Catch를 활용한 문제 정답

class Solution {
    public int solution(int[][] board) {
        int rows = board.length;  // 보드의 행 수
        int cols = board[0].length;  // 보드의 열 수
        
        int safeCount = 0;  // 안전한 칸의 수를 저장할 변수
        
        // 보드의 각 칸을 순회
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                // 현재 칸이 안전한 칸인지 확인
                if (isSafe(board, i, j)) {
                    safeCount += 1;  // 안전한 칸이라면 결과값을 증가
                }
            }
        }
        
        return safeCount;  // 최종 안전한 칸의 수를 반환
    }
    
    // 현재 위치가 안전한 칸인지 확인하는 메서드
    public boolean isSafe(int[][] board, int row, int col) {
        // 현재 위치 주변의 8개 칸을 검사
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                try {
                    // 인접한 칸에 지뢰(1)가 있다면 false를 반환
                    if (board[row + i][col + j] == 1) {
                        return false;
                    }
                } catch (ArrayIndexOutOfBoundsException e) {
                    // 배열 인덱스가 범위를 벗어나는 경우는 무시하고 계속 진행
                    continue;
                }
            }
        }
        
        return true;  // 모든 인접한 칸이 안전하다면 true를 반환
    }
}
728x90