알고리즘 연습/구현, 문자열

[🥈5 / 백준 4108 / 파이썬] 지뢰찾기

김세진 2024. 1. 7. 22:57
반응형

 

 

 

 

 

4108번: 지뢰찾기

C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다. 문자 사이에 공백이나 줄 사이에 공백 줄이 있어선

www.acmicpc.net

 

 

 

문제

07년 개봉한 영화 '지뢰찾기'는 지뢰의 수를 조사해야하는 요원 예슬의 이야기를 다룬 영화다.

정보기관의 요원이었던 예슬은 심심해서 컴퓨터로 지뢰찾기를 켰다가 인사팀에 걸려 지뢰제거팀으로 좌천된다. 좌천된 예슬에게 처음 부여된 임무는 지뢰 제거도 아닌 지뢰 수 조사!
예슬의 첫 임무에서 교육요원으로 배정된 다민은 "처음 건 무조건 안 터져." 라고 말하며 거침없이 땅을 팠지만 지뢰가 터져 얄짤없이 사망하고 만다. 지뢰 밭에 혼자 남겨진 예슬! 과연 임무를 마치고 안전하게 돌아갈 수 있을 것인가!

지뢰밭은 R X C개의 칸으로 이루어져있다.

예슬이 발을 딛는 구역 중에서 일부 칸에는 지뢰가 들어있고 나머지는 모두 비어있다. 예슬은 모든 비어있는 칸마다 인접해 있는 지뢰의 개수를 세서 적어야 한다.

선이나 점을 공유하고 있는 두개의 칸을 인접해있다고 정의한다. 즉, 모든 칸은 최대 8개의 인접한 칸을 갖고 있다. (상, 하, 좌, 우, 4개의 대각선칸)

 

 

입력

여러 개의 테스트 케이스가 제공된다.

각 테스트 케이스의 첫 번째 줄에는 행과 열의 수를 표현하는 두 개의 정수 R,C가 입력된다. (1 ≤ R,C ≤ 100)

이후 입력되는 R개의 줄은 C개의 문자로 이루어져있다. 각 문자는 지뢰를 표현하는 '*'과 빈 공간을 표현하는 '.' 이다.

0 0이 입력되면 종료된다.

 

 

출력

C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다.

문자 사이에 공백이나 줄 사이에 공백 줄이 있어선 안 된다.

 

 

예제 입력

3 2
..
.*
..
5 5
*.*.*
..*..
*****
.....
..**.
0 0

예제 출력

11
1*
11
*3*3*
36*63
*****
24553
01**1



 

 

풀이

 

주어진 입력을 통해 지뢰찾기 판을 구현하는 문제이다.

판을 순회하며 만약 현재 위치가 지뢰가 아닌 칸이라면 주변의 지뢰를 탐색해 그 개수로 변경한 뒤 출력해주어야 한다.

 

 

import sys
input = sys.stdin.readline

d = [(0, 1), (1, 0), (1, 1), (0, -1), (-1, 0), (1, -1), (-1, 1), (-1, -1)]
while True:
    n, m = map(int, input().split())
    if n == 0 and m == 0:
        break

    board = [list(input().rstrip()) for _ in range(n)]
    
    # 판을 순회하며 주변의 지뢰 수 탐색
    for x in range(n):
        for y in range(m):
            # 지뢰는 변경 x
            if board[x][y] == '*':
                continue

            cnt = 0
            for a, b in d:
                dx, dy = x+a, y+b
                # 인덱스 벗어나는 경우 
                if dx >= n or dx < 0 or dy >= m or dy < 0:
                    continue

                if board[dx][dy] == '*':
                    cnt += 1

            board[x][y] = str(cnt)

    for row in board:
        print(''.join(row))

 

 

 

반응형