티스토리 뷰
https://www.acmicpc.net/problem/4396
문제
접근 과정
먼저 지뢰의 정보가 담긴 배열과 열린 칸이 포함된 배열을 생성해주고,
열린 칸(x)이 포함된 배열의 for문을 돌며
1. 만약 x 위치에 지뢰가 있다 -> 그 즉시 모든 칸을 *로 출력한다.
2. 만약 x 위치에 지뢰가 없다 -> x에 인접한 8칸의 지뢰 수를 확인한다.
로 생각했었습니다.
하지만, 문제를 조금 더 자세히 읽었어야 했죠..
만약 지뢰가 발견되면, 지뢰가 있는 모든 칸이 *로 표시되면서 다른 모든 지역이 온점,
그리고 이전의 있던 정보들을 출력하는 것 입니다.
그림을 보면 이해가 될 것 같은데 2번 그림에서 3번 그림으로 넘어가는 과정을 생각하면 이해가 편할 것 입니다.
2번 그림에서 3번 그림으로 넘어갈 때, x 위치에서 지뢰를 찾았다면 2번 그림 + 지뢰의 위치를 출력해주는 것 입니다.
이 때문에 고민을 좀 했네요,, 문제를 더 잘읽는 습관이 필요할 것 같습니다..... (문제가 모호한 것 같기도~~)
코드
import java.io.*;
import java.util.*;
class Main {
static int N;
static char[][] matrix;
static char[][] bomb;
static int[] mx = {1, 1, 0, -1, -1, -1, 0, 1};
static int[] my = {0, -1, -1, -1, 0, 1, 1, 1};
// 현재 위치 기준 인접한(대각선 포함) 칸을 확인하기 위한 move 배열
static int countBomb(int x, int y) {
int cnt = 0;
for(int i=0; i<8;i++) {
int nx = x + mx[i];
int ny = y + my[i];
if(nx>=0 && ny>=0 && nx<N && ny<N) {
if(bomb[nx][ny]=='*') cnt++;
}
}
return cnt;
} // 현재 칸이 열린 칸일 때 인접한 칸에 폭탄이 있는지 확인하기 위한 함수
static void printBomb() {
StringBuilder sb2 = new StringBuilder();
for(int i=0; i<N; i++) {
for (int j = 0; j < N; j++) {
if(matrix[i][j] == 'x'){
if(bomb[i][j]=='*') {
sb2.append("*");
}
else{
int cnt = countBomb(i, j);
sb2.append(cnt);
}
}
else {
if(bomb[i][j]=='*') sb2.append("*");
else sb2.append(".");
}
}
sb2.append("\n");
}
System.out.println(sb2.toString());
} // 만약 열린 칸에서 폭탄이 발견된 것이라면 이전에 있던 정보를 버리고,
// 폭탄의 위치 + 열린 칸의 인접 폭탄 수를 출력하는 함수
static void solution() {
StringBuilder sb1 = new StringBuilder();
for(int i=0; i<N; i++) {
for (int j = 0; j < N; j++) {
if(matrix[i][j] == 'x'){
if(bomb[i][j]=='*') {
printBomb();
return;
}
else{
int cnt = countBomb(i, j);
sb1.append(cnt);
}
}
else {
sb1.append(".");
}
}
sb1.append("\n");
}
System.out.println(sb1.toString());
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
matrix = new char[N][N]; // 이미 열린 칸이 포함된 배열
bomb = new char[N][N]; // 폭탄이 담겨진 배열
for (int i = 0; i < N; i++) {
String tmp = br.readLine();
for (int j = 0; j < N; j++) {
bomb[i][j] = tmp.charAt(j);
}
}
for (int i = 0; i < N; i++) {
String tmp = br.readLine();
for (int j = 0; j < N; j++) {
matrix[i][j] = tmp.charAt(j);
}
}
solution();
}
}