지뢰가 하나 존재할 때 위험지대가 될 수 있는 최대의 영역 수는 예시의 그림처럼 8개이다. 만약 지뢰가 모서리 지점에 있다면 위험지대로 변할 수 있는 영역은 3개이다. board의 0으로 처리된 영역을 위험지대로 우선 지뢰의 위치에 기반하여 바꿔 주어야 하므로, for문을 통해 지뢰가 발견된다면(j=1) 바뀔 수 있는 최대 영역의 수인 8개의 경우를 모두 코딩한다.(위험지대로 인식될 경우 -5 연산) 만약 행 방향으로 다음 칸이 없을 경우는 try-except문으로 예외처리 하였으며, 열 방향의 경우 리스트의 특성상 마이너스 값도 인덱싱 조회가 되므로 조회할 인덱스가 마이너스일 경우 예외 처리를 진행했고, 또한 인덱싱 조회를 거쳤더니 해당 영역이 지뢰가 있을 경우 (1일 경우) 또한 예외처리 하였다.
코딩이 조금 더러운 듯 하나 8개의 try-except문을 반복문으로 코딩길이를 줄일 수 있을 듯 하며, -5연산을 누적시키는 것이라, 위험지도에 대한 정도의 표현도 가능하다.
def solution(board):
count = 0
for idx1, i in enumerate(board):
for idx2, j in enumerate(i):
if j == 1:
try:
if board[idx1-1][idx2-1] != 1 and idx1-1 >= 0 and idx2-1 >= 0:
board[idx1-1][idx2-1] -= 5
except:
pass
try:
if board[idx1-1][idx2] != 1 and idx1-1 >= 0 and idx2 >= 0:
board[idx1-1][idx2] -= 5
except:
pass
try:
if board[idx1-1][idx2+1] != 1 and idx1-1 >= 0 and idx2+1 >= 0:
board[idx1-1][idx2+1] -= 5
except:
pass
try:
if board[idx1][idx2-1] != 1 and idx1 >= 0 and idx2-1 >= 0:
board[idx1][idx2-1] -= 5
except:
pass
try:
if board[idx1][idx2+1] != 1 and idx1 >= 0 and idx2+1 >= 0:
board[idx1][idx2+1] -= 5
except:
pass
try:
if board[idx1+1][idx2-1] != 1 and idx1+1 >= 0 and idx2-1 >= 0:
board[idx1+1][idx2-1] -= 5
except:
pass
try:
if board[idx1+1][idx2] != 1 and idx1+1 >= 0 and idx2 >= 0:
board[idx1+1][idx2] -= 5
except:
pass
try:
if board[idx1+1][idx2+1] != 1 and idx1+1 >= 0 and idx2+1 >= 0:
board[idx1+1][idx2+1] -= 5
except:
pass
for i in board:
for j in i:
if j == 0:
count += 1
return count