[백준] 4396번 지뢰찾기 / C++

SmileJun·2025년 2월 26일

알고리즘

목록 보기
3/34

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

초기코드

#include<iostream>
using namespace std;

char arr1[11][11]; // 지뢰 위치
char arr2[11][11]; // 입력
int dx[8] = {-1,-1,-1,0,0,1,1,1};
int dy[8] = {-1,0,1,-1,1,-1,0,1};


void check(int x, int y) {
    int bom = 0;
    for(int i = 0; i < 8; i++) {
        int nx = x + dx[i]; int ny = y + dy[y];
        if(arr1[nx][ny] == '*') {
            bom++;
        }
    }
    arr2[x][y] = bom+'0';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            cin >> arr1[i][j];
            arr2[i][j] = '.';
        }
    }

    for(int a = 0; a < n; a++) {
        for(int b = 0; b < n; b++) {
            char c; cin >> c;
            if(c == 'x' && arr1[a][b] == '.') {  // 열려있는데, 지뢰없을때
                check(a,b);
            }
            else if(c=='x' && arr1[a][b] == '*') { // 열려있는데, 지뢰있을때
                for(int q = 0; q < n; q++) { // 지뢰저장해야한다.
                    for(int p = 0; p < n; p++) {
                        if(arr1[q][p] == '*') {
                            arr2[q][p] = '*';
                        }
                    }
                }
            }
        }
    }
    for(int k = 0; k < n; k++) {
        for(int o = 0; o < n; o++) {
            cout << arr2[k][o];
        }
        cout << "\n";
    }
    return 0;
}

정답코드

#include<iostream>
using namespace std;

char arr1[11][11]; // 지뢰 위치
char arr2[11][11]; // 입력
int dx[8] = {-1,-1,-1,0,0,1,1,1};
int dy[8] = {-1,0,1,-1,1,-1,0,1};

void check(int y, int x) {
    int bom = 0;
    for(int i = 0; i < 8; i++) {
        int ny = y + dy[i]; 
        int nx = x + dx[i];
        if(arr1[ny][nx] == '*') {
            bom++;
        }
    }
    arr2[y][x] = bom+'0';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            cin >> arr1[i][j];
            arr2[i][j] = '.';
        }
    }

    for(int a = 0; a < n; a++) {
        for(int b = 0; b < n; b++) {
            char c; cin >> c;
            if(c == 'x' && arr1[a][b] == '.') {  // 열려있는데, 지뢰없을때
                check(a,b);
            }
            else if(c=='x' && arr1[a][b] == '*') { // 열려있는데, 지뢰있을때
                for(int q = 0; q < n; q++) { // 지뢰저장해야한다.
                    for(int p = 0; p < n; p++) {
                        if(arr1[q][p] == '*') {
                            arr2[q][p] = '*';
                        }
                    }
                }
            }
        }
    }
    for(int k = 0; k < n; k++) {
        for(int o = 0; o < n; o++) {
            cout << arr2[k][o];
        }
        cout << "\n";
    }
    return 0;
}

문제풀이

  • 초기 지뢰게임 세팅을 위한 입력을 하고, 직접 지뢰게임을 하면서 x입력에는 주변 8자리에 지뢰가 몇 개있는지 출력한다. 그래서 먼저 arr1에 지뢰게임 세팅하고, arr2 값을 모두 .으로 초기화했다. 그 다음 사용자의 입력을 받고, 입력이 x면서 arr1 해당 위치에 지뢰가 없으면 주변 8자리에 지뢰가 몇 개있는지 출력. 만약 입력이 x지만 arr1 해당 위치에 지뢰가 있다면 arr2 해당 위치에 지뢰 저장. 그리고 arr2 출력한다.

Comment

  • 처음에 check 함수를 만들 때, x와 y 위치를 틀렸다. arr1[a][b]일 때 a의 위치는 y축, b의 위치는 x축이기 때문에 위치를 변경해야한다. 처음 문제를 봤을 때 map을 사용해야하는지, 이차원 배열을 사용할지 등등 접근하는데 어려웠다.
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글