본문 바로가기
Algorithm/Programmers

[Programmers] Lv.0 | 안전지대 | Java

by unknownomad 2025. 9. 30.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120866

 

풀이

public class Solution {
    public int solution(int[][] board) {
        int n = board.length;
        boolean[][] dangerZone = new boolean[n][n]; // 위험지역 표시 배열

        // 8방향을 나타내는 방향 벡터 (상, 하, 좌, 우, 대각선)
        int[] dx = {-1, -1, -1,  0, 0, 1, 1, 1};
        int[] dy = {-1,  0,  1, -1, 1, -1, 0, 1};

        // 1. 지뢰와 그 주변 8칸을 위험지역으로 표시
        for (int x = 0; x < n; x++) {
            for (int y = 0; y < n; y++) {
                if (board[x][y] == 1) { // 지뢰 발견
                    dangerZone[x][y] = true; // 지뢰 위치 자체도 위험

                    // 8방향 모두 확인
                    for (int dir = 0; dir < 8; dir++) {
                        int nx = x + dx[dir];
                        int ny = y + dy[dir];

                        // 보드 범위 안에 있을 때만 처리 (범위 체크)
                        if (0 =< nx && nx < n && 0 =< ny && ny < n) {
                            dangerZone[nx][ny] = true;
                        }
                    }
                }
            }
        }

        // 2. 안전지역(= 위험지역이 아닌 곳) 개수 세기
        int safeCount = 0;
        for (int x = 0; x < n; x++) {
            for (int y = 0; y < n; y++) {
                if (!dangerZone[x][y]) {
                    safeCount++;
                }
            }
        }

        return safeCount;
    }
}

참고

📌 방향 벡터 dx, dy

지뢰 주변 8칸(상하좌우 + 대각선)을 탐색하기 위해 방향 벡터 사용

int[] dx = {-1, -1, -1,  0, 0, 1, 1, 1};
int[] dy = {-1,  0,  1, -1, 1, -1, 0, 1};
(-1,-1)  (-1,0)  (-1,1)
( 0,-1)  ( x,y ) ( 0,1)
( 1,-1)  ( 1,0)  ( 1,1)
  • dx[i], dy[i]를 짝으로 보면, (x + dx[i], y + dy[i])가 주변 8칸 중 하나를 나타냄
방향  dx  dy  의미
↖ 좌상단 -1 -1 x-1, y-1
↑ 위 -1 0 x-1, y
↗ 우상단 -1 +1 x-1, y+1
← 왼쪽 0 -1 x, y-1
→ 오른쪽 0 +1 x, y+1
↙ 좌하단 +1 -1 x+1, y-1
↓ 아래 +1 0 x+1, y
↘ 우하단 +1 +1 x+1, y+1

 

 

📌 조건문 if (nx >= 0 && ny >= 0 && nx < n && ny < n)

보드에서 주변 칸을 탐색할 때, 보드 범위 밖으로 나가는 좌표는 무시해야 함

이 조건이 없으면 배열 인덱스 초과 예외 (ArrayIndexOutOfBoundsException) 발생 가능

  • 예: 보드 크기가 5x5일 경우, 인덱스는 0 ~ 4까지만 유효함
// 좌표가 유효한 범위 내에 있는지 확인
if (nx >= 0 && ny >= 0 && nx < n && ny < n)
조건  의미
nx >= 0 왼쪽/위로 벗어나지 않음
ny >= 0 위쪽/왼쪽으로 벗어나지 않음
nx < n 오른쪽 범위 초과 안 함
ny < n 아래쪽 범위 초과 안 함

 

댓글