Programmers | 코딩테스트 입문 - 안전지대(자바)

2023. 4. 4. 14:16공부/Programmers

프로그래머스 Lv.0 안전지대

 

 

 

JAVA

import java.util.*;
class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int[][] targetBoard = new int[board.length][board.length];  // 새로운 보드
        
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board.length; j++){
                if(board[i][j] == 1) getTarget(i,j,targetBoard);
            }
        }
        
        for(int[] arr : targetBoard){
            for(int val : arr){
                if(val == 0) answer++;
            }
        }
        return answer;
    }
    
    public void getTarget(int x, int y, int[][] targetBoard){   //지뢰 인접한 지역도 1 처리
        int max = targetBoard.length;
        
        int[] chkX = {0,-1,-1,-1,0,0,1,1,1};
        int[] chkY = {0,-1,0,1,-1,1,-1,0,1};
        
        int newX;
        int newY;
        
        for(int i=0; i<9; i++){
            newX = x + chkX[i];
            newY = y + chkY[i];
            
            if((newX < max && newX >= 0) && (newY < max && newY >= 0)){
                targetBoard[newX][newY] = 1;
            }
        }
    }
}

지뢰를 기준으로 (-1,-1) / (-1,0) / (-1,1) / (0,-1) / (0,1) / (1,-1) / (1,0) / (1,1) 곳이 위험지역이다.

따라서 getTarget함수에서 해당 위치를 1로 지정하고, 새로운 보드이므로 지뢰 위치(0,0)도 1로 세팅한다.

여기서 주의할 점은 newX,newY값이 0보다 작으면 안되고, board 길이보다 크면 안된다.

(board는 n x n 이므로 board.length로만 체크해도 된다.)

 

getTarget함수에서 설정한 targetBoard를 순차적으로 돌면서 해당 위치의 값이 0인 경우에만 answer값을 1씩 올리면

안전지역의 수를 구할 수 있다.