✏️ 문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
✏️ code
📌 List<int[]> oneBoard = new ArrayList<>();
- indexOf는 배열에서 첫 번째 일치하는 값만 찾을 수 있기에 이 문제와 적절하지 않습니다.
- 여러 개의 1을 처리하기 위해선 별도의 저장이 필요하므로, List<int[]> oneBoard로 1의 위치를 저장하였습니다.
📌 8방 탐색
- oneBoard for문: 1의 위치를 저장한 배열이고, 첫번째 인덱스부터 돌면서 초기 x, y 값을 찾습니다.
- 8방 탐색 for문: 8방 탐색 for문을 돌면서 dx, dy를 이용해 1로 변경해야 할 위험지역을 표시합니다.
- 8방 탐색 if문:
1) nx와 ny가 범위 내에 있고(nx ny >= 0, nx < n, ny < m),
2) 아직 0인 경우에만(board[nx][ny] == 0)
3) 1로 변경합니다.(board[nx][ny] = 1)
📌flatMapToInt(Arrays::stream)
- board는 int[][]이므로 → stream<int[]> → IntStream으로 처리해야 .filter, .count 메서드를 사용할 수 있습니다.
import java.util.*;
class Solution {
public int solution(int[][] board) {
// 1의 위치: 2차 배열로
int n = board.length; // 행의 개수
int m = board[0].length; // 열의 개수
List<int[]> oneBoard = new ArrayList<>();
for (int i = 0 ; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == 1) {
oneBoard.add(new int[]{i, j});
}
}
}
// 8방 탐색: 위험지역 표시
int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};
int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};
for (int[] pos : oneBoard) {
int x = pos[0];
int y = pos[1];
for (int d = 0; d < 8; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx >=0 && nx < n && ny >= 0 && ny < m && board[nx][ny] == 0) {
board[nx][ny] = 1;
}
}
}
// 안전지역 개수 return
return (int) Arrays.stream(board)
.flatMapToInt(Arrays::stream)
.filter(b -> b == 0)
.count();
}
}
반응형
'Java > 코딩테스트' 카테고리의 다른 글
[java/프로그래머스/120924] 다음에 올 숫자 (등차수열, 등비수열 비교) (0) | 2025.02.11 |
---|---|
[java/프로그래머스/120868] 삼각형의 완성조건(2) (삼항연산자, answer += min * 2 - 1) (0) | 2025.02.11 |
[java/프로그래머스/120956] 옹알이(1) (.stream, .filter, .matches, .count()) (0) | 2025.02.10 |
[java/프로그래머스/12950] 행렬의 덧셈 (answer=arr1, answer[i][j]+=arr2[i][j]) (2) | 2025.02.04 |
[java/프로그래머스/120860] 직사각형 넓이 구하기 (Math.abs(), Math.max()) (0) | 2025.02.04 |