0. 문제
1. 문제 풀이
def solution(board):
n = len(board)
directions = [(1,0), (0,1), (-1,0), (0,-1), (1,1), (1, -1), (-1,1), (-1,-1)]
def is_valid(x,y):
return 0 <= x < n and 0 <= y < n
for i in range(n):
for j in range(n):
if board[i][j] == 1:
for dx, dy in directions:
nx, ny = i + dx, j + dy
if is_valid(nx, ny) and board[nx][ny] == 0:
board[nx][ny] = 2
safe_area = sum(row.count(0) for row in board)
return safe_area
- board를 순회하며 만약 1이라면 안전하지 않으니 주변을 2로 바꾸고
- 끝나면 0의 숫자를 세는 아이디어
- directions, 상,하,좌,우,대각선 확인
- is_valid, 확인 중 board의 인덱스 범위를 벗어나는지 아닌지 확인하는 함수
2. 다른사람 풀이
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)
- enumerate는 iterable(예: 리스트, 튜플, 문자열 등)을 순회할 때, 각 아이템과 함께 해당 아이템의 인덱스를 반환하는 함수
- n은 board의 크기, danger은 위험안 셀의 위치를 저장
- 위험한 셀 탐색: 각 셀을 순회하며 x가 아닌 경우(조건을 만족하는 경우)
- 안전한 셀 계산: n * n에서 danger 집합에 포함된 유효한 셀의 개수를 빼서, 안전한 셀의 개수를 반환