티스토리 뷰
https://www.acmicpc.net/problem/4396
- 문제 :
지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어가 진다. 지뢰가 없는 지점을 건드리면, 그곳의 상하좌우 혹은 대각선으로 인접한 8개의 칸에 지뢰가 몇 개 있는지 알려주는 0과 8 사이의 숫자가 나타난다. 완전히 플레이되지 않은 게임에서 일련의 동작이 아래에 나타나 있다.
여기서, n은 8이고, m은 10이며, 빈 칸은 숫자 0을 의미하고, 올라가 있는 칸은 아직 플레이되지 않은 위치이며, 별표 모양(*)과 닮은 그림은 지뢰를 의미한다. 맨 왼쪽의 그림은 일부만이 플레이된 게임을 나타낸다. 첫 번째 그림에서 두 번째 그림으로 오면서, 플레이어는 두 번의 이동을 시행해서, 두 번 다 안전한 곳을 골랐다. 세 번째 그림을 볼 때 플레이어는 운이 썩 좋지는 않았다. 지뢰가 있는 곳을 골라서 게임에서 졌다. 플레이어는 m개의 열리지 않은 칸을 남길 때까지 계속해서 안전한 곳을 고르면 이긴다. 그 m개의 칸은 반드시 지뢰이다.
당신이 할 일은 일부가 플레이된 게임의 정보를 읽어 해당하는 격자를 출력하는 것이다.
- 풀이 :
문자열 파싱과 구현 문제였습니다.
Python은 문자열을 배열처럼 파싱할 수 있으므로 쉽게 접근이 가능합니다.
현재 좌표를 기준으로 상하좌우대각선의 8방향을 탐색하기 위해 dx, dy 배열에 x, y 변환값을 저장하였고
지뢰의 위치가 담겨있는 board, 사용자의 클릭이 담겨있는 player, 정답을 담아서 출력하기 위한 answer 배열을 선언했습니다.
X,Y축으로 N만큼 모든 좌표를 탐색하며 player가 x인 경우 (클릭한 경우) 클릭한 좌표를 기준으로 8방위를 탐색하여 지뢰의 개수를 카운트하고 이 값을 answer에 저장했습니다. 여기서 클릭한 좌표값이 지뢰인 경우 (board[x][y]가 *인 경우)
지뢰를 밟았다는 표시로 flag를 True로 변경하고 모든 지뢰의 좌표를 answer에 넣어주었습니다.
- 소스코드 :
dx = [-1, -1, -1, 0, 0 ,1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
N = int(input())
board = [input() for _ in range(N)]
player = [input() for _ in range(N)]
answer = [['.' for _ in range(N)] for _ in range(N)]
flag = False
for i in range(N):
for j in range(N):
if player[i][j] == "x":
if board[i][j] == "*":
flag = True
cnt = 0
for k in range(8):
x = i + dx[k]
y = j + dy[k]
if 0<= x < N and 0 <= y < N:
if board[x][y] == "*":
cnt += 1
answer[i][j] = str(cnt)
if flag:
for a in range(N):
for b in range(N):
if board[a][b] == "*":
answer[a][b] = "*"
for i in range(N):
print(''.join(answer[i]))
'Algorithm > Implementation' 카테고리의 다른 글
(Python) - BOJ(5052번) : 전화번호 목록 (0) | 2022.03.07 |
---|---|
(Python) - BOJ(1614번) : 영식이의 손가락 (0) | 2022.03.07 |
(Python) - BOJ(1264번) : 모음의 개수 (2) | 2022.03.05 |
(Python) - BOJ(1991번) : 트리 순회 (2) | 2022.03.03 |
(Python) - BOJ(2174번) : 로봇 시뮬레이션 (0) | 2022.03.03 |