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

보양쿠·2023년 6월 29일
0

BOJ

목록 보기
146/260
post-custom-banner

BOJ 4108 - 지뢰찾기 링크
(2023.06.29 기준 S5)

문제

R * C 크기를 가진 지뢰밭이 주어진다. 각 칸에는 빈 칸을 나타내는 '.'이나 지뢰를 나타내는 '*'가 적혀 있다.
지뢰가 있지 않은 칸에 '인접한 여덟 칸에 있는 지뢰의 개수'를 적어야 할 때, 완성 및 출력

알고리즘

단순 구현

풀이

BOJ 1996 - 지뢰 찾기 풀이와 굉장히 유사하다.
다른 점은 테스트 케이스의 개수, 사각형의 모양, 칸마다 지뢰의 개수 정도? 굳이 다루지 않아도 될 정도라서 그냥 위 풀이를 참고하자. (이번 풀이 글은 그냥 쉬어가자,,)

코드

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

// 주위 지뢰의 개수를 저장할 행렬
int result[100][100];

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

string matrix[100];

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

    int R, C;
    for (cin >> R >> C; R; cin >> R >> C){
        for (int i = 0; i < R; i++) cin >> matrix[i];

        // 주위 지뢰의 개수를 저장할 행렬 초기화
        memset(result, 0, sizeof(result));

        // 지뢰가 있는 칸을 찾아 인접해 있는 칸에 1을 더하자.
        for (int i = 0; i < R; i++) for (int j = 0; j < C; j++)
            if (matrix[i][j] == '*')
                for (int k = 0; k < 8; k++){
                    int ii = i + di[k], jj = j + dj[k];
                    if (0 <= ii && ii < R && 0 <= jj && jj < C) result[ii][jj] += 1;
                }

        for (int i = 0; i < R; i++){
            for (int j = 0; j < C; j++){
                if (matrix[i][j] == '*') // 지뢰가 있는 칸
                    cout << '*';
                else // 지뢰가 없는 칸
                    cout << result[i][j];
            }
            cout << '\n';
        }
    }
}
  • Python
import sys; input = sys.stdin.readline

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

while True:
    R, C = map(int, input().split())
    if not R: break
    matrix = [input().strip() for _ in range(R)]

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

    # 지뢰가 있는 칸을 찾아 인접해 있는 칸에 1을 더하자.
    for i in range(R):
        for j in range(C):
            if matrix[i][j] == '*':
                for di, dj in dir:
                    if 0 <= i + di < R and 0 <= j + dj < C:
                        result[i + di][j + dj] += 1

    for i in range(R):
        for j in range(C):
            if matrix[i][j] == '*': # 지뢰가 있는 칸
                print('*', end = '')
            else: # 지뢰가 없는 칸
                print(result[i][j], end = '')
        print()
profile
GNU 16 statistics & computer science
post-custom-banner

0개의 댓글