📑 1. 문제설명


💡 2. 접근방식
✔️ 문제 요약 - 지뢰찾기 게임
- board는 n x n 크기의 2D 배열이다.
- 지뢰가 있는 위치는 1, 없는 위치는 0이다.
- 지뢰(1)가 있는 곳을 기준으로 주변 8방향 + 자기 자신까지 위험지대(1)로 표시해야 한다.
- 최종적으로 안전한 지역(0)의 개수를 반환하는 문제이다.
✔️ 풀이 방식
- 배열 bd[][] 생성 → 기존 board[][]의 정보를 가져온다.
- board[][] 에서 지뢰(1)를 찾으면 주변 8방향 + 자기 자신을 1로 변경한다.
- 이 때 중요한 것은 배열 범위를 벗어나지 않도록 Math.min(), Math.max()를 사용해서 인덱스 위치를 조정한다.
- 모든 위험지대를 표시한 후 남은 0의 개수를 세어 반환한다.

그림으로 표현해 보았다. 지뢰가 있는 위치 즉, board[i][j] == 1이라면 주변 8칸을 아래와 같이 표현할 수 있다. m은 minus를 딴 것이고 p는 plus이다. [im]은 [i-1], [ip]는 [i+1], [jm]은 [j-1], [jp]는 [j+1]이다.

board[i][j] == 1 이라면 주변 8칸을 모두 1로 채워준다.
이 때 중요한 것은 배열 ArrayIndexOutOfBoundsException 에러를 방지하기 위해서 인덱스의 제한 범위를 설정해 주어야 한다.
배열에서 왼쪽이나 위쪽으로 계속 이동하다 보면 인덱스가 0보다 작아질 수 있다. 이 경우 더 큰 값인 0을 고를 수 있게 Math.max(i - 1, 0)과 Math.max(j - 1, 0) 처리를 해 준다.
반대로 오른쪽으로 이동하거나 아래로 이동하는 경우 배열 마지막 인덱스인 n-1보다 인덱스가 커질 수 있다. 그 때는 최소값인 n-1을 고를 수 있도록 Math.min(i + 1, n -1)과 Math.min(j + 1, n - 1)을 한다.
- Math.min(i + 1, n - 1) → 배열 아래(↓)로 이동하되, 최대 n-1까지만 이동
- Math.max(i - 1, 0) → 배열 위(↑)로 이동하되, 최소 0까지만 이동
- Math.min(j + 1, n - 1) → 배열 오른쪽(→)으로 이동하되, 최대 n-1까지만 이동
- Math.max(j - 1, 0) → 배열 왼쪽(←)으로 이동하되, 최소 0까지만 이동
변수 | 이동 방향 | 계산식 |
ip | 아래(↓) 이동 | i + 1 (단, 최대 n-1) |
im | 위(↑) 이동 | i - 1 (단, 최소 0) |
jp | 오른쪽(→) 이동 | j + 1 (단, 최대 n-1) |
jm | 왼쪽(←) 이동 | j - 1 (단, 최소 0) |
⭐ 3. 정답코드
import java.util.*;
class Solution {
public int solution(int[][] board) {
int answer = 0;
int n = board.length;
int[][] bd = new int[n][n];
// 1. 원본 보드 탐색하기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 1) { // 지뢰 발견!
// 인덱스가 배열 범위 넘지 않게 처리
int ip = Math.min(i + 1, n - 1);
int im = Math.max(i - 1, 0);
int jp = Math.min(j + 1, n - 1);
int jm = Math.max(j - 1, 0);
// 9칸 모두 1로 설정 (자기 자신 + 8방향)
bd[i][j] = 1;
bd[i][jp] = 1;
bd[i][jm] = 1;
bd[ip][j] = 1;
bd[im][j] = 1;
bd[ip][jp] = 1;
bd[ip][jm] = 1;
bd[im][jp] = 1;
bd[im][jm] = 1;
}
}
}
// 2. 안전지대(0) 개수 세기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (bd[i][j] == 0) answer++;
}
}
return answer;
}
}
🐦 4. TMI
이게 lv 0 문제라니 생각보다 쉽지 않다.
'코딩테스트 > JAVA테스트' 카테고리의 다른 글
[프로그래머스] (Java) 피자 나눠 먹기 (1), (2), (3) (6) | 2025.03.10 |
---|---|
[프로그래머스] (Java) 최빈값 구하기 (해시맵) (9) | 2025.03.06 |
[리트코드] LeetCode Longest Common Prefix (Easy) in Java (23) | 2025.02.22 |
[프로그래머스] (Java) 카드뭉치 (큐) (6) | 2025.02.20 |
[백준] (Java) 요세푸스 문제 (큐) (7) | 2025.02.20 |
📑 1. 문제설명


💡 2. 접근방식
✔️ 문제 요약 - 지뢰찾기 게임
- board는 n x n 크기의 2D 배열이다.
- 지뢰가 있는 위치는 1, 없는 위치는 0이다.
- 지뢰(1)가 있는 곳을 기준으로 주변 8방향 + 자기 자신까지 위험지대(1)로 표시해야 한다.
- 최종적으로 안전한 지역(0)의 개수를 반환하는 문제이다.
✔️ 풀이 방식
- 배열 bd[][] 생성 → 기존 board[][]의 정보를 가져온다.
- board[][] 에서 지뢰(1)를 찾으면 주변 8방향 + 자기 자신을 1로 변경한다.
- 이 때 중요한 것은 배열 범위를 벗어나지 않도록 Math.min(), Math.max()를 사용해서 인덱스 위치를 조정한다.
- 모든 위험지대를 표시한 후 남은 0의 개수를 세어 반환한다.

그림으로 표현해 보았다. 지뢰가 있는 위치 즉, board[i][j] == 1이라면 주변 8칸을 아래와 같이 표현할 수 있다. m은 minus를 딴 것이고 p는 plus이다. [im]은 [i-1], [ip]는 [i+1], [jm]은 [j-1], [jp]는 [j+1]이다.

board[i][j] == 1 이라면 주변 8칸을 모두 1로 채워준다.
이 때 중요한 것은 배열 ArrayIndexOutOfBoundsException 에러를 방지하기 위해서 인덱스의 제한 범위를 설정해 주어야 한다.
배열에서 왼쪽이나 위쪽으로 계속 이동하다 보면 인덱스가 0보다 작아질 수 있다. 이 경우 더 큰 값인 0을 고를 수 있게 Math.max(i - 1, 0)과 Math.max(j - 1, 0) 처리를 해 준다.
반대로 오른쪽으로 이동하거나 아래로 이동하는 경우 배열 마지막 인덱스인 n-1보다 인덱스가 커질 수 있다. 그 때는 최소값인 n-1을 고를 수 있도록 Math.min(i + 1, n -1)과 Math.min(j + 1, n - 1)을 한다.
- Math.min(i + 1, n - 1) → 배열 아래(↓)로 이동하되, 최대 n-1까지만 이동
- Math.max(i - 1, 0) → 배열 위(↑)로 이동하되, 최소 0까지만 이동
- Math.min(j + 1, n - 1) → 배열 오른쪽(→)으로 이동하되, 최대 n-1까지만 이동
- Math.max(j - 1, 0) → 배열 왼쪽(←)으로 이동하되, 최소 0까지만 이동
변수 | 이동 방향 | 계산식 |
ip | 아래(↓) 이동 | i + 1 (단, 최대 n-1) |
im | 위(↑) 이동 | i - 1 (단, 최소 0) |
jp | 오른쪽(→) 이동 | j + 1 (단, 최대 n-1) |
jm | 왼쪽(←) 이동 | j - 1 (단, 최소 0) |
⭐ 3. 정답코드
import java.util.*; class Solution { public int solution(int[][] board) { int answer = 0; int n = board.length; int[][] bd = new int[n][n]; // 1. 원본 보드 탐색하기 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 1) { // 지뢰 발견! // 인덱스가 배열 범위 넘지 않게 처리 int ip = Math.min(i + 1, n - 1); int im = Math.max(i - 1, 0); int jp = Math.min(j + 1, n - 1); int jm = Math.max(j - 1, 0); // 9칸 모두 1로 설정 (자기 자신 + 8방향) bd[i][j] = 1; bd[i][jp] = 1; bd[i][jm] = 1; bd[ip][j] = 1; bd[im][j] = 1; bd[ip][jp] = 1; bd[ip][jm] = 1; bd[im][jp] = 1; bd[im][jm] = 1; } } } // 2. 안전지대(0) 개수 세기 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (bd[i][j] == 0) answer++; } } return answer; } }
🐦 4. TMI
이게 lv 0 문제라니 생각보다 쉽지 않다.
'코딩테스트 > JAVA테스트' 카테고리의 다른 글
[프로그래머스] (Java) 피자 나눠 먹기 (1), (2), (3) (6) | 2025.03.10 |
---|---|
[프로그래머스] (Java) 최빈값 구하기 (해시맵) (9) | 2025.03.06 |
[리트코드] LeetCode Longest Common Prefix (Easy) in Java (23) | 2025.02.22 |
[프로그래머스] (Java) 카드뭉치 (큐) (6) | 2025.02.20 |
[백준] (Java) 요세푸스 문제 (큐) (7) | 2025.02.20 |