* 순서
- 문제
- 문제설명
- 문제풀이
- 최종코드
- 문제
- 문제설명:
지뢰가 있는 지역은 1로 표시되며 위험지역이다..
지뢰가 있는 지역으로부터 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래는 위험지역이다.
안전지역의 개수를 리턴한다.
- 문제풀이:
1. 1표시가 있는 지뢰가 있는 지역을 찾는다.
2. 지뢰를 찾았으면 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래를 2로 표시한다.(위험지역이라는 임의표시)
3. 안전지역인 0개수를 구한다.
1. 1표시가 있는 지뢰가 있는 지역을 찾는다.
//1찾기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(board[i][j] == 1) {
checkDangerZone(i, j, board);
}
}
}
2. 지뢰를 찾았으면 왼쪽, 오른쪽, 위, 아래, 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래를 2로 표시한다.(위험지역이라는 임의표시)
checkDangerZone() 메서드 이용
private static void checkDangerZone(int i, int j, int[][] board) {
int nowX = i;
int nowY = j;
for (int k = 0; k < 8; k++) {
int nextX = nowX + dx[k];
int nextY = nowY + dy[k];
if(nextX >= 0 && nextY >= 0 && nextX < n && nextY < n) {
//안전지역이라면 위험존 표시로 2로 채우기
if(board[nextX][nextY] == 0) {
board[nextX][nextY] = 2;
}
}
}
}
3. 안전지역인 0개수를 구한다.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(board[i][j] == 0) {
answer++;
}
}
}
- 최종코드
package coding;
public class Main {
private static int[] dx = {-1, 1, 0, 0, -1, 1, -1, 1};
private static int[] dy = {0, 0, 1, -1, 1, 1, -1, -1};
private static int n;
public static void main(String[] args) {
// int[][] board = {{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}};
// int[][] board = {{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}};
int[][] board = {{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}};
int solution = solution(board);
System.out.println("solution = " + solution);
}
public static int solution(int[][] board) {
int answer = 0;
n = board.length;
//1찾기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(board[i][j] == 1) {
checkDangerZone(i, j, board);
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(board[i][j] == 0) {
answer++;
}
}
}
return answer;
}
private static void checkDangerZone(int i, int j, int[][] board) {
int nowX = i;
int nowY = j;
for (int k = 0; k < 8; k++) {
int nextX = nowX + dx[k];
int nextY = nowY + dy[k];
if(nextX >= 0 && nextY >= 0 && nextX < n && nextY < n) {
//안전지역이라면 위험존 표시로 2로 채우기
if(board[nextX][nextY] == 0) {
board[nextX][nextY] = 2;
}
}
}
}
}
'Algorithm' 카테고리의 다른 글
[정렬 알고리즘] 선택정렬(Selection Sort), 삽입정렬(Insertion Sort) (0) | 2023.05.21 |
---|---|
[프로그래머스] Lv.0 삼각형의 완성조건 (2) (0) | 2022.10.28 |
[LeetCode] 2446. Determine if Two Events Have Conflict (0) | 2022.10.23 |
백준 3009. 네 번째 점(Java) (0) | 2022.08.07 |
백준 17626. Four Squares (Java) (0) | 2022.06.23 |
댓글