백준 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);
    }
}

총평

후기

개선할 점