문제 설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
입출력 예 #1
Input : [[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]] / Output : 16
(3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다.
따라서 16을 return 합니다.
입출력 예 #2
Input : [[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]] / Output : 13
(3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다.
따라서 위험지역을 제외한 칸 수 13을 return 합니다.
입출력 예 #3
Input : [[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]] / Output : 0
모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return 합니다.
제출코드
- 만약 해당 지역이 폭탄이라면 체크 표시해야 할 Y좌표, X좌표를 가지고 있는 2차원 배열(checkPoints)를 생성합니다.
- 주어진 배열을 돌아가며 폭탄이 있는지 확인합니다. (isBomb == 1)
- 만약 폭탄이 있다면 checkPoints를 돌아가며 해당 지역의 값을 2로 변경시켜 주었습니다.
- 이때 주어진 배열(board)에서만 체크를 해야 하므로 X좌표, Y좌표가 index가 0보다 크거나 같고 board의 length보다 작은지 확인 후 2로 변경하였습니다.
- 마지막으로 주어진 배열에서 안전한 지역(value 0)의 개수를 필터링해 Int로 변환 후 반환하였습니다.
import java.util.Arrays;
class Solution {
public int solution(int[][] board) {
int[][] checkPoints = new int[][] {
{1, -1}, {1, 0}, {1, 1},
{0, -1}, {0, 1},
{-1, -1}, {-1, 0}, {-1, 1}
};
int boardLengthY = board.length;
for (int y = 0; y < board.length; y++) {
int boardLengthX = board[y].length;
for (int x = 0; x < boardLengthX; x++) {
int isBomb = board[x][y];
if (isBomb == 1) {
for (int[] checkPoint : checkPoints) {
int checkPointY = (y + checkPoint[0]);
int checkPointX = (x + checkPoint[1]);
if (checkPointY >= 0 && checkPointY < boardLengthY &&
checkPointX >= 0 && checkPointX < boardLengthX) {
if (board[checkPointX][checkPointY] == 0) {
board[checkPointX][checkPointY] = 2;
}
}
}
}
}
}
return Arrays.stream(board)
.map(x -> (int) Arrays.stream(x).filter(y -> y == 0).count())
.reduce(0, Integer::sum);
}
}
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/120866
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 최빈값 구하기 (0) | 2024.11.08 |
---|---|
[프로그래머스] 연속된 수의 합 (0) | 2024.11.08 |
[프로그래머스] 겹치는 선분의 길이 (0) | 2024.11.07 |
[프로그래머스] 평행 (0) | 2024.11.07 |
[프로그래머스] 옹알이 (1) (0) | 2024.11.06 |