본문 바로가기

Algorithm/Programers - Java

[프로그래머스(Java)] 안전지대

 

Level. 0

 

 

문제

 

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


지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return 하도록 solution 함수를 완성해 주세요.

 

* 제한사항

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

 

풀이

class Solution {
    public int solution(int[][] board) {
        int answer = 0;
        int n = board.length;
        int[][] safe = new int[n][n]; // 배열은 0으로 초기화
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(board[i][j] == 1){
                    
                    safe[i][j] = 1;
                    
                    if(i>0){
                      if(j>0)   safe[i-1][j-1] = 1;
                      if(j<n-1) safe[i-1][j+1] = 1;
                      safe[i-1][j] = 1;
                    }
                    
                    if(i<n-1){
                      if(j>0)   safe[i+1][j-1] = 1;
                      if(j<n-1) safe[i+1][j+1] = 1;
                      safe[i+1][j] = 1;
                    }
                    
                    if(j>0)   safe[i][j-1] = 1;
                    if(j<n-1) safe[i][j+1] = 1;
                }
            }
        }
        
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(safe[i][j] == 0) answer += 1;
            }        
        }
        
        return answer;
    }
}

 

해결방법

1. board와 같은 크기의 safe배열을 만들고 board를 탐색하며, 폭탄이 발견될 경우 인접한 8칸과 폭탄 칸을 safe에 1로 저장한다.

2. 탐색을 마치고 safe배열의 값이 0인칸의 합계를 구하여 리턴한다.

 

 

 

 


 

https://school.programmers.co.kr/learn/courses/30/lessons/120866?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr