티스토리 뷰
문제
https://www.acmicpc.net/problem/4396
언어
자바 Java
로직
현재 위치에서 상하좌우 그리고 대각선을 포함하여 총 8개의 위치에 지뢰가 존재하는지 확인하면 됩니다. 주의해야 할 점은 중간에 지뢰를 만나게 된다면 지뢰판에 존재하는 모든 지뢰를 표시하여 출력하여야 합니다.
지뢰판 정보 입력
char[][] board = new char[n][n];
for (int i = 0; i < n; i++) {
char[] tmp = br.readLine().toCharArray();
for (int j = 0; j < tmp.length; j++)
board[i][j] = tmp[j];
}
이동하기
지뢰판을 한 칸씩 이동하면서 현재 위치에 어떤 값이 저장되어 있는지 확인합니다.
- '.'이 저장된 경우
- 'x'가 저장된 경우
1번 케이스는 아직 지뢰판을 열지 않은 경우이므로 그대로 출력해 줍니다.
2번 케이스는 지뢰판을 연 경우입니다. 따라서 지뢰판에 어떤 값이 저장되어 있는지 확인해야 합니다.
- 지뢰가 저장된 경우
- 지뢰가 저장되지 않은 경우
1번의 경우 지뢰가 발견되었으므로 최종 출력에서 지뢰가 존재하는 영역을 모두 표시해주어야 합니다. 따라서 meetLandMine 변수를 true로 저장해 줍니다.(추후에 지뢰위치를 출력하기 위한 용도)
2번의 경우 지뢰가 발견되지 않았습니다. 따라서 상하좌우 그리고 대각선 총 8개의 위치를 확인하여 지뢰가 몇 개가 존재하는지 확인해야 합니다. 그러고 난후 발견된 지뢰 개수를 출력해 주면 됩니다.
char[][] result = new char[n][n];
for (int y = 0; y < n; y++) {
String input = br.readLine();
for (int x = 0; x < input.length(); x++) {
if (input.charAt(x) == '.') {
result[y][x] = '.';
} else {
if (existLandMine(board, x, y))
meetLandMine = true;
result[y][x] = String.valueOf(traverseAround(board, y, x, n)).charAt(0);
}
}
}
이동하다가 지뢰를 만난 경우
바로 위에서 지뢰를 만난 경우에 meetLandMine 변수에 true를 저장해주었습니다. 그러므로 다음 메서드를 실행합니다.
지뢰가 존재 하는 위치를 최종 결과에 수정해 줍니다.
if (meetLandMine)
editResult(board, result);
private static void editResult(char[][] board, char[][] result) {
for (int y = 0; y < board.length; y++) {
for (int x = 0; x < board.length; x++) {
if (board[y][x] == '*')
result[y][x] = '*';
}
}
}
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private static final int[] dx = {0, 0, -1, 1, -1, 1, -1, 1};
private static final int[] dy = {-1, 1, 0, 0, -1, -1, 1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuffer sb = new StringBuffer();
int n = Integer.parseInt(br.readLine());
char[][] board = new char[n][n];
for (int i = 0; i < n; i++) {
char[] tmp = br.readLine().toCharArray();
for (int j = 0; j < tmp.length; j++)
board[i][j] = tmp[j];
}
boolean meetLandMine = false;
char[][] result = new char[n][n];
for (int y = 0; y < n; y++) {
String input = br.readLine();
for (int x = 0; x < input.length(); x++) {
if (input.charAt(x) == '.') {
result[y][x] = '.';
} else {
if (existLandMine(board, x, y))
meetLandMine = true;
result[y][x] = String.valueOf(traverseAround(board, y, x, n)).charAt(0);
}
}
}
if (meetLandMine)
editResult(board, result);
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++)
sb.append(result[y][x]);
sb.append("\n");
}
System.out.println(sb);
}
private static int traverseAround(char[][] board, int x, int y, int size) {
int count = 0;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (ny < 0 || ny >= size || nx < 0 || nx >= size)
continue;
if (board[ny][nx] == '*')
count++;
}
return count;
}
private static boolean existLandMine(char[][] board, int x, int y) {
return board[y][x] == '*';
}
private static void editResult(char[][] board, char[][] result) {
for (int y = 0; y < board.length; y++) {
for (int x = 0; x < board.length; x++) {
if (board[y][x] == '*')
result[y][x] = '*';
}
}
}
}