문제
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 | 아래쪽 범위 초과 안 함 |
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] Lv.0 | 다항식 더하기 | Java (0) | 2025.10.02 |
---|---|
[Programmers] Lv.0 | 숨어있는 숫자의 덧셈 (2) | Java (0) | 2025.10.01 |
[Programmers] Lv.0 | 삼각형의 완성조건 (2) | Java (0) | 2025.09.29 |
[Programmers] Lv.0 | 외계어 사전 | Java (0) | 2025.09.27 |
[Programmers] Lv.0 | 저주의 숫자 3 | Java (0) | 2025.09.26 |
댓글