티스토리 뷰

PS/BOJ

[구현] 4396번 지뢰찾기

GiHoo 2023. 6. 20. 12:44

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

 

4396번: 지뢰 찾기

지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어

www.acmicpc.net

 


문제

 


접근 과정

먼저 지뢰의 정보가 담긴 배열과 열린 칸이 포함된 배열을 생성해주고,

열린 칸(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();
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30