알고리즘

백준 4396번 지뢰 찾기 (JAVA)

박카스마시며코딩 2023. 10. 16. 19:59

https://www.acmicpc.net/problem/4396

 

4396번: 지뢰 찾기

첫 번째 줄에는 10보다 작거나 같은 양의 정수 n이 입력된다. 다음 n개의 줄은 지뢰의 위치를 나타낸다. 각각의 줄은 n개의 문자를 사용하여 한 행을 나타낸다. 온점(.)은 지뢰가 없는 지점이며 별

www.acmicpc.net

 

저는 구현을 통해 문제를 해결하였습니다.

클릭한 곳의 8방향의 지뢰개수를 확인하였고 이 값을 결과 배열에 넣었습니다.

만약 클릭한 곳이 한 곳이라도 지뢰가 있다면, 모든 지뢰를 결과 배열에 표시하여 문제를 해결하였습니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    private static final char OPEN = 'x';
    private static final char EMPTY = '.';
    private static final char MINE = '*';
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        char[][] map = new char[n][n];
        for(int i = 0 ; i < n ; i++){
            String commmand = br.readLine();
            for(int j = 0 ; j < n ; j++){
                map[i][j] = commmand.charAt(j);
            }
        }
        char[][] click = new char[n][n];
        for(int i = 0 ; i < n ; i++){
            String commmand = br.readLine();
            for(int j = 0 ; j < n ; j++){
                click[i][j] = commmand.charAt(j);
            }
        }
        char[][] result = cal(map,click,n);
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                System.out.print(result[i][j]);
            }
            System.out.println();
        }
    }
    private static final int[] DY = {-1,0,1,0,-1,1,1,-1};
    private static final int[] DX = {0,1,0,-1,1,1,-1,-1};
    private static char[][] cal(char[][] map, char[][] click, int n) {
        char[][] result = new char[n][n];
        boolean openedMine = false;
        for(int i = 0 ; i < n ; i++){
            Arrays.fill(result[i],EMPTY);
            for(int j = 0 ; j < n ; j++){
                if(click[i][j] == OPEN && map[i][j] == MINE){
                    openedMine = true;
                }
                if(click[i][j] == OPEN){
                    int cnt = 0;
                    for(int k = 0 ; k < 8 ; k++){
                        int ny = i + DY[k];
                        int nx = j + DX[k];
                        if(nx >= 0 && nx < n && ny >= 0 && ny < n && map[ny][nx] == MINE){
                            cnt++;
                        }
                    }
                    result[i][j] = (char)(cnt + '0');
                }
            }
        }
        if(!openedMine){
            return result;
        }
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                if(map[i][j] == MINE){
                    result[i][j] = MINE;
                }
            }
        }
        return result;
    }
}