Notion에서 작성한 글이라, 여기에서 더 깔끔하게 보실 수 있습니다! 😮😊
game_board
에서 BFS/DFS를 통해 빈 공간의 좌표를 추출하고, table
에서 BFS/DFS를 통해 퍼즐 조각의 좌표를 추출한다.game_board
에서는 0
에 대해 탐색하고, table
에서는 1
에 대해 탐색해야 함에 유의해야 한다.game_board
든 회전시킨 좌표를 추출해 낸 다음, 이 또한 상대좌표로 변환한다.cc
가 set을 return한다. 빈 칸이든, 퍼즐의 모양이든 중복된 모양이 있을 수 있으므로 set으로 관리하면 안 된다.pieces
에 저장되는데, 어떤 빈칸을 채운 퍼즐은 다른 빈 칸에 이용할 수 없어야 하지만 각기 다른 네 모양이 pieces
에 남아있으므로 퍼즐이 실제보다 더 많이 저장된다.from collections import deque
def solution(game_board, table):
def cc(arr, v):
n = len(arr)
a = [r[:] for r in arr]
def bfs(i, j):
rel_coords = {(0, 0)}
queue = deque([(i, j)])
a[i][j] = not v
delta = ((-1, 0), (1, 0), (0, -1), (0, 1))
while queue:
y, x = queue.popleft()
for dy, dx in delta:
ny, nx = y+dy, x+dx
if 0<=ny<n and 0<=nx<n and a[ny][nx] == v:
a[ny][nx] = not v
rel_coords.add((ny-i, nx-j))
queue.append((ny, nx))
return tuple(sorted(rel_coords))
return {bfs(i, j) for i in range(n) for j in range(n) if a[i][j] == v}
def rotate(arr):
n = len(arr)
ret = [r[:] for r in arr]
for i in range(n):
for j in range(n):
ret[j][n-1-i] = arr[i][j]
return ret
empty = cc(game_board, 0)
pieces = cc(table, 1)
for _ in range(3):
table = rotate(table)
pieces.update(cc(table, 1))
ret = empty&pieces
return sum(map(len, ret))