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

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
입출력 예
| board | result |
| [[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. 지뢰 주변 위치값 8군데 지정
int[] dx = {-1, 0, 1, -1, 1, -1, 0, 1};
int[] dy = {1, 1, 1, 0, 0, -1, -1, -1};
| [-1, 1] | [0, 1] | [1, 1] |
| [-1, 0] | 💣 | [1, 0] |
| [-1, -1] | [0, -1] | [1, -1] |
dx와 dy는 💣를 기준으로 위아래 값의 x값, y값의 위치값을 뜻합니다.
2. 지뢰 위치값 찾기
for(int i=0; i<board.length; i++){
for(int j=0; j<board[0].length; j++){
if(board[i][j] == 1){
int[] temp = {i, j};
mine.add(temp);
}
}
}
for문을 중첩해서 board 2차원 배열 안에 지뢰값이 어디에 있는지 찾아줍니다.
그렇게 찾은 값의 x값과 y값을 temp라는 배열에 넣어줍니다.
생성된 temp를 앞서 지정한 ArrayList인 mine에 넣어줍니다.
3. 지뢰 주변 위치 8군데를 1로 바꿔주기
for(int z=0; z<mine.size(); z++){
int i = mine.get(z)[0];
int j = mine.get(z)[1];
for(int v=0; v<8; v++){
if(dx[v]+i >= 0 && dy[v]+j >= 0 && dx[v]+i <= board.length-1 && dy[v]+j <= board.length-1){
board[dx[v]+i][dy[v]+j] = 1;
}
}
}
앞서 설명한 8군데를 1로 바꿔주는 단계입니다.
위치값으로는 지뢰(💣)가 있는 기준 8방향입니다 → dx[v]+i >= 0 && dy[v]+j >= 0
그리고 board배열을 벗어나지 않은 곳에 위치해 있어야 합니다→ dx[v]+i <= board.length-1 && dy[v]+j <= board.length-1
4. 0인 값 개수 세기
for(int i=0; i<board.length; i++){
for(int j=0; j<board[0].length; j++){
if(board[i][j] == 0){
answer++;
}
}
}
코드
import java.util.*;
class Solution {
public int solution(int[][] board) {
ArrayList<int[]> mine = new ArrayList<>();
int[] dx = {-1, 0, 1, -1, 1, -1, 0, 1};
int[] dy = {1, 1, 1, 0, 0, -1, -1, -1};
int answer = 0;
for(int i=0; i<board.length; i++){
for(int j=0; j<board[0].length; j++){
if(board[i][j] == 1){
int[] temp = {i, j};
mine.add(temp);
}
}
}
for(int z=0; z<mine.size(); z++){
int i = mine.get(z)[0];
int j = mine.get(z)[1];
for(int v=0; v<8; v++){
if(dx[v]+i >= 0 && dy[v]+j >= 0 && dx[v]+i <= board.length-1 && dy[v]+j <= board.length-1){
board[dx[v]+i][dy[v]+j] = 1;
}
}
}
for(int i=0; i<board.length; i++){
for(int j=0; j<board[0].length; j++){
if(board[i][j] == 0){
answer++;
}
}
}
return answer;
}
}
제가 작성한 코드는 아래에서 확인하실 수 있습니다.
https://github.com/eonwy/programmers
GitHub - eonwy/programmers: 🔎 coding-test (programmers) 🔍
🔎 coding-test (programmers) 🔍. Contribute to eonwy/programmers development by creating an account on GitHub.
github.com
'🫧 코테 : CodingTest' 카테고리의 다른 글
| [프로그래머스] Java : 평행 (2) | 2024.04.11 |
|---|---|
| [프로그래머스] Java : 외계어 사전 (1) | 2024.04.03 |
| [프로그래머스] Java : 다항식 더하기 (0) | 2024.04.02 |
| [프로그래머스] Java : 직사각형 넓이 구하기 (0) | 2024.04.01 |
| [프로그래머스] Java : 잘라서 배열로 저장하기(substring) (1) | 2024.03.28 |