백준 4396 - 지뢰 찾기
Updated:
Java
4396 번 - 지뢰 찾기
문제
접근 방법
‘x’인 점을 만날 때 마다 8방향으로 탐색하여 지뢰의 수를 센다. 만약, 지뢰가 있는 곳에 ‘x’로 열리면 전체 지뢰를 표기한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
char[][] board = new char[n][n];
for(int i = 0; i < n; i++)
board[i] = br.readLine().toCharArray();
char[][] result = new char[n][n];
for(int i = 0; i < n; i++)
result[i] = br.readLine().toCharArray();
boolean isExplode = false;
int[] dy = {-1,-1,-1,0,0,1,1,1};
int[] dx = {-1,0,1,-1,1,-1,0,1};
int y, x;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
// 'x'인 점 기준으로 8방향 탐색
if(result[i][j] == 'x') {
int cnt = 0;
for(int k = 0; k < 8; k++) {
y = i + dy[k];
x = j + dx[k];
if(isIn(y,x) && board[y][x] == '*') {
cnt++;
}
}
result[i][j] = (char) (cnt + '0');
// 지뢰를 밟을 때
if(board[i][j] == '*')
isExplode = true;
}
}
}
if(isExplode) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == '*')
result[i][j] = '*';
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sb.append(result[i][j]);
}
sb.append("\n");
}
System.out.println(sb.toString());
br.close();
}
// 주어진 범위 안에 있는가
public static boolean isIn(int y, int x){
if(y < 0 || y >= n || x < 0 || x >= n)
return false;
return true;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}