문제
- NxN 격자에 M개의 지뢰가 숨겨져 있다.
- 격자판의 어느 지점을 선택했을 때 지뢰가 있으면 플레이어가 진다.
- 지뢰가 없는 지점을 선택하면 인접한 8개의 칸에 지뢰가 몇 개 있는 지 0-8 사이의 숫자로 알려준다.
- 일부가 플레이된 게임의 정보가 주어질 때, 해당하는 격자 출력하기
- 온점(.)은 지뢰가 없는 지점, 별(*)은 지뢰가 있는 지점,
- 이미 열린 칸은 영소문자 x로, 열리지 않은 칸은 온점(.)으로 표시한다.
- 만약 지뢰가 있는 칸이 열렸다면 지뢰있는 모든 칸이 별표(*)로 표시되고 다른 지점들은 온점(.)이어야 한다.
풀이
- 1) 지뢰가 터진 경우
- 이미 열린 칸은 0-8 사이의 숫자로, 지뢰는 * 표시로, 나머지 칸은 온점(.)으로 표시한다.
- 2) 지뢰가 터지지 않은 경우
- 이미 열린 칸은 0-8 사이의 숫자로, 나머지 칸은 온점(.)으로 표시한다.
- 지뢰가 있는 칸을 set에 기록해둔다.
- 지뢰가 터졌는지 먼저 확인하고 mine_flag 의 값을 설정한다.
- 격자판을 차례로 돌면서 지뢰가 터진 경우에는 *를, 아닌 경우에 오픈된 칸에는 0-8 숫자를, 오픈되지 않은 칸은 .을 추가한다.
# 지뢰가 터졌는지 확인하는 함수
def check_mine(graph, mine) :
for i in range(N) :
for j in range(N) :
if graph[i][j] == 'x' and (i, j) in mine :
return True
return False
N = int(input())
# 지뢰 위치 기록
mine = set()
for i in range(N) :
line = list(map(str, input()))
for j in range(N) :
if line[j] == '*' :
mine.add((i, j))
# 현재 격자판 입력
graph = [list(map(str, input())) for _ in range(N)]
dx = (-1, 1, 0, 0, -1, -1, 1, 1)
dy = (0, 0, -1, 1, -1, 1, -1, 1)
mine_flag = check_mine(graph, mine) # 지뢰가 터진 경우 True
for i in range(N) :
line = ''
for j in range(N) :
if (i, j) in mine and mine_flag :
line += '*'
elif graph[i][j] == 'x' : # 오픈되었다면
line += str(sum([1 if (i+dx[d], j+dy[d]) in mine else 0 for d in range(8)]))
else :
line += '.'
print(line)
References