Blog

안전지대

날짜 2023-10-08
사용 언어 Java
문제 유형 IF문, 반복문, 배열
정답률 59%
문제 URL https://school.programmers.co.kr/learn/courses/30/lessons/120866

문제 #

문제 설명 #

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

제한사항 #
  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

나의 풀이 #

//정보처리기사 실기 22년 3회 문제(c언어) 기반 풀이
class Solution {
    public int solution(int[][] board) {
        int n = board.length;
        int[][] warn = new int[n][n];

        //전체 board를 돌며 지뢰가 있는 경우를 찾는다.
        for(int y = 0; y<n; y++) {
            for(int x = 0; x<n; x++) {
                if(board[y][x] == 0) continue;

                //지뢰가 있는 곳 기준으로 x,y좌표가 -1~1일경우 카운트
                for(int i = y-1; i<=y+1; i++) {
                    for(int j = x-1; j<=x+1; j++) {
                        //0,0과 같이 배열의 끝에 지뢰가 있을 경우의 out of bounds 에러를 대비
                        if(i>=0 && i<n && j>=0 && j<n) {
                            warn[i][j] += 1;
                        }
                    }
                }

            }
        }

        // warn배열중 값이 0일 경우 안전지역
        int answer = 0;

        for(int[] y : warn) {
            for(int safe : y) {
                if(safe==0) answer++;
            }
        }

        /*
        출력 테스트
        System.out.println("board(warn)");
        for(int i = 0; i<n; i++) {
            for(int j = 0; j<n; j++) {
                System.out.print(" "+board[i][j]+"("+warn[i][j]+") |");
            }
            System.out.println();
        }
        */

        return answer;
    }
}

다른 사람의 풀이 #

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int length = board.length;   //길이
        int[][] temp = new int[length+2][length+2];
        // 길이를 2 늘린 액자용 배열 생성 -> 이러면 단순한 조건식으로 안전영역 구할 수 있음

        // 액자에 board 이식.
        for(int i=1; i<length+1; i++){
            for(int j=1; j<length+1;j++){
                temp[i][j]=board[i-1][j-1];
            }
        }

        //위험지대 찾기
        for(int i=1; i<length+1; i++){
            for(int j=1; j<length+1;j++){
                if(temp[i][j]==1){
                    for(int a = i-1; a<=i+1; a++){
                        for(int b =j-1; b<=j+1; b++){
                            if(temp[a][b]!=1) temp[a][b]=2;
                        }
                    }
                }
            }
        }

        // 안전지대 카운트
        for(int i=1; i<length+1; i++){
            for(int j=1; j<length+1;j++){
                if(temp[i][j]==0) answer++;
                System.out.print(temp[i][j]);
            }
            System.out.println("");
        }

        return answer;
    }
}

관련개념 학습 #

정보 처리 기사 2022 3회 실기 복원 문제

정보 처리 기사 2022 3회 실기 복원 문제