본문 바로가기

Java/코딩테스트

[java/프로그래머스/120866] 안전지대 (List<int[]> oneBoard, 8방 탐색, flatMapToInt(Arrays::stream))

✏️ 문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.


지뢰는 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();
    }
}
반응형