https://school.programmers.co.kr/learn/courses/30/lessons/120866
def solution(board):
N = len(board)
dx = [-1, 1, 0, 0, -1, -1, 1, 1] # 8방향 탐색
dy = [0, 0, -1, 1, -1, 1, -1, 1]
# 지뢰 설치
boom = []
for i in range(N):
for j in range(N):
if board[i][j] == 1:
boom.append((i, j)) # 지뢰일때의 인덱스 추가
# 지뢰가 설치된 곳 주변에 폭탄 설치
for x, y in boom:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N:
board[nx][ny] = 1
# 폭탄이 설치되지 않은 곳만 카운팅
count = 0
for x in range(N):
for y in range(N):
if board[x][y] == 0:
count += 1
return count
8
방향 탐색을 위해 상, 하, 좌, 우, 좌상, 우상, 좌하, 우하 방향 순으로 dx
, dy
배열을 만들었다. 위로 이동할 경우 [-1, 0]
좌표 이동을 한다고 이해할 수 있다.1
을 더하려고 했는데, 그러면 원래 폭탄이 어디있었는지 모르게 되어버려서 새로운 boom
배열에 저장하기로 했다.x + dx[i]
처럼 좌표 이동 연산을 통해 1
을 대입했다.def solution(board):
n = len(board)
danger = set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if not x:
continue
danger.update((i + di, j + dj) for di in [-1, 0, 1] for dj in [-1, 0, 1])
return n * n - sum(0 <= i < n and 0 <= j < n for i, j in danger)
i
는 행의 인덱스, row
는 해당 행의 리스트이고, j
는 열의 인덱스, x
는 해당 위치의 값이다.if not x
를 통해 폭탄이 없다면 다음으로 넘어가고, 폭탄이 있다면 해당 위치를 포함한 8
방향 이동한 위치, 총 9
개의 위치를 danger
에 추가한다.enumerate()
함수는 반복 가능한 객체를 순회할 때, 각 요소와 함께 해당 요소의 인덱스도 함께 제공하는 파이썬 내장 함수이다.update()
함수는 set
자료형의 메서드로, 기존 집합에 여러 요소를 한꺼번에 추가할 때 사용된다. 이때 추가되는 요소들은 반복 가능한 객체여야 한다.피드백은 언제나 환영입니다 :)