프로그래머스/JAVA/안전지대

Seoung Young Oh·2022년 12월 27일
0

프로그래머스

목록 보기
97/105
post-thumbnail

문제설명

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

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

제한사항

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

입출력 예

boardresult
[[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]]16
[[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]]13
[[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]]0

입출력 예 설명

입출력 예 #1

  • (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

입출력 예 #2

  • (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

입출력 예 #3

  • 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.

풀이

2차원 배열을 일단 보기 좋은 형태로 나열.

[
[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]
]

위험 지역으로 처리 되어야 할 지점은
board[i][j]가 1인 지점의 주변 8지점이고,

8지점의 위치는

board[i-1][j-1], board[i-1][j] ,board[i-1][j+1] (위 세 지점)
board[i][j-1],       지뢰        board[i][j+1] (수평 두 지점)
board[i+1][j-1], board[i+1][j], board[i+1][j+1] (아래 세 지점)

위험지역은 위 인덱스 값을 대입하여 요소 값을 2로 변경해 주면 되는데,
변경조건은 

1. 배열을 벗어나면 안되고, 
2. 위험이역으로 지정된 자리에 지뢰가 위험지역으로 변경되면 안된다.

이것을 쉽게 처리 하기위해 index i와 j에 더해줄 값들을 배열(arrI,arrJ)로 미리 지정하고,
반복문을 통해 대입해주었다.

배열의 범위를 벗아났을 때 발생하는 예외는 try-catch문으로 처리하고, catch문에서,
continue로 반복문이 계속 진행되게 했다.

지뢰가 없는 경우에만( board[i+arrI[k]][j+arrJ[k]]!=1 ), 위험지역으로 변경해주었다.

다시 반복문을 돌려 안전지역(0)의 개수를 answer로 집계했다.
class Solution {
	public int solution(int[][] board) {

		int answer = 0;

		int[] arrI = {-1,-1,-1,0,0,1,1,1};
		int[] arrJ = {-1,0,1,-1,1,-1,0,1};
		
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board.length; j++) {
				if (board[i][j] == 1) {

					for (int k = 0; k < arrJ.length; k++) {
						try {
							if(board[i+arrI[k]][j+arrJ[k]]!=1) {
								board[i+arrI[k]][j+arrJ[k]] = 2;	
							}							
						} catch (Exception e) {
							continue;
						}
					}
				}
			}
		}

		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board.length; j++) {
				if (board[i][j] == 0) {
					answer++;
				}
			}
		}

		return answer;
	}
}	

참고

0개의 댓글

관련 채용 정보