프로그래머스 안전지대

KIMYEONGJUN·2026년 9월 28일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

내가 이 문제를 보고 생각해본 부분

배열의 크기를 저장할 변수 n을 선언한다.
위험 지역 여부를 기록할 isDanger 2차원 배열을 생성한다.
주변 9칸을 탐색하기 위해 행과 열의 변화량을 담은 dr과 dc 배열을 정의한다.
이중 반복문을 활용하여 전체 배열을 돌며 지뢰(1)가 있는 위치를 탐색한다.
지뢰를 발견하면 주변 9칸의 좌표(ni, nj)를 계산한다.
계산된 좌표가 배열 범위를 벗어나지 않는지 조건문으로 확인한다.
조건에 만족하면 isDanger 배열의 해당 위치를 true로 변경한다.
지뢰 처리가 모두 끝난 뒤, 다시 이중 반복문으로 전체 배열을 순회한다.
위험 지역으로 지정되지 않은 안전한 칸을 만나면 answer 값을 1씩 증가시킨다.
최종적으로 계산된 안전 지역의 총 개수를 반환한다.

코드로 구현

class Solution {
    public int solution(int[][] board) {
        int n = board.length;
        boolean[][] isDanger = new boolean[n][n];
        
        int[] dr = {-1, -1, -1, 0, 0, 0, 1, 1, 1};
        int[] dc = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 1) {
                    for (int k = 0; k < 9; k++) {
                        int ni = i + dr[k];
                        int nj = j + dc[k];
                        if (ni >= 0 && ni < n && nj >= 0 && nj < n) {
                            isDanger[ni][nj] = true;
                        }
                    }
                }
            }
        }
        
        int answer = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (!isDanger[i][j]) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
}

프로그래머스 코드

package programmers.programmers2;

// 프로그래머스 안전지대
public class Main157 {
    public static void main(String[] args) {
        Solution sol = new Solution();

        // 입출력 예 #1
        int[][] board1 = {
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0}
        };
        System.out.println(sol.solution(board1));

        // 입출력 예 #2
        int[][] board2 = {
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0},
                {0, 0, 1, 1, 0},
                {0, 0, 0, 0, 0}
        };
        System.out.println(sol.solution(board2));

        // 입출력 예 #3
        int[][] board3 = {
                {1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1}
        };
        System.out.println(sol.solution(board3));
    }

    static class Solution {
        public int solution(int[][] board) {
            int n = board.length;
            boolean[][] isDanger = new boolean[n][n];

            int[] dr = {-1, -1, -1, 0, 0, 0, 1, 1, 1};
            int[] dc = {-1, 0, 1, -1, 0, 1, -1, 0, 1};

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (board[i][j] == 1) {
                        for (int k = 0; k < 9; k++) {
                            int ni = i + dr[k];
                            int nj = j + dc[k];
                            if (ni >= 0 && ni < n && nj >= 0 && nj < n) {
                                isDanger[ni][nj] = true;
                            }
                        }
                    }
                }
            }

            int answer = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (!isDanger[i][j]) {
                        answer++;
                    }
                }
            }

            return answer;
        }
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글