퍼즐 조각 채우기
테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈 공간에 적절히 올려놓으려 합니다. 게임 보드와 테이블은 모두 각 칸이 1x1 크기인 정사각 격자 모양입니다. 이때, 다음 규칙에 따라 테이블 위에 놓인 퍼즐 조각을 게임 보드의 빈칸에 채우면 됩니다.
다음은 퍼즐 조각을 채우는 예시입니다.
위 그림에서 왼쪽은 현재 게임 보드의 상태를, 오른쪽은 테이블 위에 놓인 퍼즐 조각들을 나타냅니다. 테이블 위에 놓인 퍼즐 조각들 또한 마찬가지로 [상,하,좌,우]로 인접해 붙어있는 경우는 없으며, 흰 칸은 퍼즐이 놓이지 않은 빈 공간을 나타냅니다. 모든 퍼즐 조각은 격자 칸에 딱 맞게 놓여있으며, 격자 칸을 벗어나거나, 걸쳐 있는 등 잘못 놓인 경우는 없습니다.
이때, 아래 그림과 같이 3,4,5번 조각을 격자 칸에 놓으면 규칙에 어긋나므로 불가능한 경우입니다.
다음은 규칙에 맞게 최대한 많은 조각을 게임 보드에 채워 넣은 모습입니다.
최대한 많은 조각을 채워 넣으면 총 14칸을 채울 수 있습니다.
현재 게임 보드의 상태 game_board
, 테이블 위에 놓인 퍼즐 조각의 상태 table
이 매개변수로 주어집니다. 규칙에 맞게 최대한 많은 퍼즐 조각을 채워 넣을 경우, 총 몇 칸을 채울 수 있는지 return 하도록 solution 함수를 완성해주세요.
game_board
의 행 길이 ≤ 50game_board
의 각 열 길이 = game_board
의 행 길이
game_board
의 모든 원소는 0 또는 1입니다.table
의 행 길이 = game_board
의 행 길이table
의 각 열 길이 = table
의 행 길이
game_board
와 같은 크기의 정사각 격자 모양입니다.table
의 모든 원소는 0 또는 1입니다.game_board
에는 반드시 하나 이상의 빈칸이 있습니다.table
에는 반드시 하나 이상의 블록이 놓여 있습니다.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 |
입출력 예 #1
입력은 다음과 같은 형태이며, 문제의 예시와 같습니다.
입출력 예 #2
블록의 회전은 가능하지만, 뒤집을 수는 없습니다.
아직 초보 수준의 나는 문제를 풀지도.. 이해하지도 못했으므로 추후 DFS 공부 후 재도전할 예정이다.
import copy
def dfs(graph, x, y, position, n, num):
dic = {0:[-1, 0], 1:[0, 1], 2:[1, 0], 3:[0, -1]}
ret = [position]
for i in range(4):
nx = x + dic[i][0]
ny = y + dic[i][1]
if 0 <= nx < n and 0 <= ny < n and graph[nx][ny] == num:
graph[nx][ny] = 2
ret = ret + dfs(graph, nx, ny, [position[0]+dic[i][0], position[1]+dic[i][1]], n, num)
return ret
def rotate(lst):
n = len(lst)
ret = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
ret[j][n-1-i] = lst[i][j]
return ret
def solution(game_board, table):
answer = 0
game_board_copy = copy.deepcopy(game_board)
n = len(game_board)
block = []
for i in range(n):
for j in range(n):
if game_board_copy[i][j] == 0:
game_board_copy[i][j] = 2
result = dfs(game_board_copy, i, j, [0, 0], n, 0)[1:]
block.append(result)
for r in range(4):
table = rotate(table)
table_rotate_copy = copy.deepcopy(table)
for i in range(n):
for j in range(n):
if table_rotate_copy[i][j] == 1:
table_rotate_copy[i][j] = 2
result = dfs(table_rotate_copy, i, j, [0, 0], n, 1)[1:]
if result in block:
block.pop(block.index(result))
answer += (len(result) + 1)
table = copy.deepcopy(table_rotate_copy)
else:
table_rotate_copy = copy.deepcopy(table)
return answer