테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈 공간에 적절히 올려놓으려 합니다. 게임 보드와 테이블은 모두 각 칸이 1x1 크기인 정사각 격자 모양입니다. 이때, 다음 규칙에 따라 테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈칸에 채우면 됩니다.
다음은 퍼즐 조각을 채우는 예시입니다.
위 그림에서 왼쪽은 현재 게임 보드의 상태를, 오른쪽은 테이블 위에 놓인 퍼즐 조각들을 나타냅니다. 테이블 위에 놓인 퍼즐 조각들 또한 마찬가지로 [상,하,좌,우]로 인접해 붙어있는 경우는 없으며, 흰 칸은 퍼즐이 놓이지 않은 빈 공간을 나타냅니다. 모든 퍼즐 조각은 격자 칸에 딱 맞게 놓여있으며, 격자 칸을 벗어나거나, 걸쳐 있는 등 잘못 놓인 경우는 없습니다.
이때, 아래 그림과 같이 3,4,5번 조각을 격자 칸에 놓으면 규칙에 어긋나므로 불가능한 경우입니다.
다음은 규칙에 맞게 최대한 많은 조각을 게임 보드에 채워 넣은 모습입니다.
최대한 많은 조각을 채워 넣으면 총 14칸을 채울 수 있습니다.
현재 게임 보드의 상태 game_board, 테이블 위에 놓인 퍼즐 조각의 상태 table이 매개변수로 주어집니다. 규칙에 맞게 최대한 많은 퍼즐 조각을 채워 넣을 경우, 총 몇 칸을 채울 수 있는지 return 하도록 solution 함수를 완성해주세요.
game_board | table | result |
---|---|---|
[[1,1,0,0,1,0], [0,0,1,0,1,0], [0,1,1,0,0,1], [1,1,0,1,1,1], [1,0,0,0,1,0], [0,1,1,1,0,0]] | [[1,0,0,1,1,0], [1,0,1,0,1,0], [0,1,1,0,1,1], [0,0,1,0,0,0], [1,1,0,1,1,0], [0,1,0,0,0,0]] | 14 |
[[0,0,0], [1,1,0], [1,1,1]] | [[1,1,1], [1,0,0], [0,0,0]] | 0 |
# 코드
import copy
def dfs(graph, r, c, p, n, num):
result = [p]
for d_r, d_c in [[1, 0], [-1, 0], [0, 1], [0, -1]]:
new_r, new_c = r + d_r, c + d_c
if 0 <= new_r < n and 0 <= new_c < n and graph[new_r][new_c] == num:
graph[new_r][new_c] = 2
result += dfs(graph, new_r, new_c, [p[0]+d_r, p[1]+d_c], n, num)
return result
def rotate(table, n):
result = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
result[i][j] = table[n-j-1][i]
return result
def solution(game_board, table):
answer = 0
n = len(game_board)
block = []
for i in range(n):
for j in range(n):
if game_board[i][j] == 0:
game_board[i][j] = 2
result = dfs(game_board, i, j, [0, 0], n, 0)
block.append(result)
for _ in range(4):
table = rotate(table, n)
table_copy = copy.deepcopy(table)
for i in range(n):
for j in range(n):
if table_copy[i][j] == 1:
table_copy[i][j] = 2
result = dfs(table_copy, i, j, [0, 0], n, 1)
if result in block:
block.pop(block.index(result))
answer += len(result)
table = copy.deepcopy(table_copy)
else:
table_copy = copy.deepcopy(table)
return answer