board를 순회하면서 1이 있는 경우에 해당 위치와 인근 8개 위치를 set에 저장
dx, dy로 현재위치 포함 9개의 위치 인덱스를 저장한 후 for문으로 순회하며 저장
set의 길이 = 1의 개수
반환값 = 0의 개수(안전한 지대의 개수) = board의 크기(n*n) - set의 길이
1이 있는 위치를 찾기위해 이미 이중for문을 돌렸는데 dx,dy때문에 또 for문을 중첩시키는게 부담일 것 같아서 고민했는데 이게 제일 나은 방법같아서 선택했는데 시간초과는 안났다.
다른 사람 코드를 보니까 4중으로 for문을 작성한 사람도 있었다🫢
내 코드랑 로직은 같으나 dx, dy가 3개씩 반복되는 걸 이용해서 dx * dy로 사용했다. (아래 첨부)
아니 근데 이거 레벨 0인데 왜 dx dy가 나오는 것?
def solution(board):
n = len(board)
pos = set([])
dx = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
dy = [1, 0, -1, 1, -1, 0, 1, 0, -1]
for i, row in enumerate(board):
for j, col in enumerate(row):
if col == 1:
for x, y in zip(dx, dy):
if 0 <= i + x < n and 0 <= j + y < n:
pos.add((i + x, j + y))
return n * n - len(pos)
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)