[BOJ 1996] - 지뢰 찾기 (구현, C++, Python)

보양쿠·2023년 6월 23일
0

BOJ

목록 보기
142/252

BOJ 1996 - 지뢰 찾기 링크
(2023.06.23 기준 S5)

문제

N * N 크기를 가진 정사각형 모양의 지뢰 찾기 map이 주어진다. 각 칸에는 빈 칸을 나타내는 '.'이나 지뢰의 개수를 나타내는 숫자가 적혀 있다.
주어지는 map의 정보를 가지고, 지뢰가 있지 않은 칸에 '인접한 여덟 칸의 지뢰의 개수를 합한 수'를 적어야 할 때, 완성 및 출력

알고리즘

단순 구현

풀이

일단 인접한 칸에 있는 지뢰의 개수를 합해 저장할 행렬을 주어지는 map 크기에 맞게 하나 더 만들자.

지뢰가 있는 칸을 찾아 인접한 여덟 칸에 지뢰 개수를 더하자. 지뢰가 있는 칸인지 확인하는 방법은 아스키 코드를 이용하는 방법이 있다. '.' 아니면 숫자 형태의 문자인데, '.'의 아스키 코드는 46, '0'부터의 아스키 코드는 48부터다. 이를 이용해 빈 칸인지 아닌지 구별하자.
(Python에선 문자열에 isdigit 라는 메소드가 있다. 이는 숫자 형태의 문자인지 판별해줘서 더욱 간단하게 풀 수 있다.)

모든 칸 검사를 끝내면 이제 저장된 지뢰 개수를 출력하면 되는데, 지뢰가 있는 칸인지 먼저 검사하고 10 이상인지 검사하고 둘 다 해당하지 않으면 개수를 출력하면 된다.

코드

  • C++
#include <bits/stdc++.h>
using namespace std;

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

    int N; cin >> N;
    string matrix[N]; for (int i = 0; i < N; i++) cin >> matrix[i];

    // 주위 지뢰의 개수를 저장할 행렬
    int result[N][N]; memset(result, 0, sizeof(result));

    // 12시 방향부터 시계 방향으로 8방향
    int di[8] = {-1, -1, 0, 1, 1,  1,  0, -1};
    int dj[8] = { 0,  1, 1, 1, 0, -1, -1, -1};

    // 지뢰가 있는 칸을 찾아 인접해 있는 칸에 지뢰 개수를 더하자.
    for (int i = 0; i < N; i++) for (int j = 0; j < N; j++){
        int n = (int)(matrix[i][j] - '0');
        if (n != -2) // '.'_ascii - '0'_ascii = -2
            for (int k = 0; k < 8; k++){
                int ii = i + di[k], jj = j + dj[k];
                if (0 <= ii && ii < N && 0 <= jj && jj < N) result[ii][jj] += n;
            }
    }

    for (int i = 0; i < N; i++){
        for (int j = 0; j < N; j++){
            if ((int)(matrix[i][j] - '0') != -2) // 지뢰가 있는 칸
                cout << '*';
            else if (result[i][j] >= 10) // 주위 지뢰가 10개 이상
                cout << 'M';
            else // 주위 지뢰가 10개 미만
                cout << result[i][j];
        }
        cout << '\n';
    }
}
  • Python
import sys; input = sys.stdin.readline

N = int(input())
matrix = [input().strip() for _ in range(N)]

# 주위 지뢰의 개수를 저장할 행렬
result = [[0] * N for _ in range(N)]

# 12시 방향부터 시계 방향으로 8방향
dir = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]

# 지뢰가 있는 칸을 찾아 인접해 있는 칸에 지뢰 개수를 더하자.
for i in range(N):
    for j in range(N):
        if matrix[i][j].isdigit(): # 숫자를 나타내는 문자라면 지뢰가 있는 칸이다.
            n = int(matrix[i][j])
            for di, dj in dir:
                if 0 <= i + di < N and 0 <= j + dj < N:
                    result[i + di][j + dj] += n

for i in range(N):
    for j in range(N):
        if matrix[i][j].isdigit(): # 지뢰가 있는 칸
            print('*', end = '')
        elif result[i][j] >= 10: # 주위 지뢰가 10개 이상
            print('M', end = '')
        else: # 주위 지뢰가 10개 미만
            print(result[i][j], end = '')
    print()
profile
GNU 16 statistics & computer science

0개의 댓글