728x90
- 이동 함수 구현: 보드를 상, 하, 좌, 우로 이동시키는 함수들을 작성합니다.
- DFS 탐색: 최대 5번 이동을 시도하며 각 이동에서의 보드 상태를 재귀적으로 탐색합니다.
- 깊은 복사: 각 이동을 시도할 때 원래 보드의 상태를 보존하기 위해 깊은 복사를 사용합니다.
- 최대값 추적: 이동 시도 후 현재 보드 상태에서 가장 큰 블록 값을 추적합니다.
import sys
import copy
N = int(input())
pan = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
ans = 0
# 왼쪽으로 이동
def left(board):
for i in range(N):
cursor = 0
for j in range(1, N):
if board[i][j] != 0:
tmp = board[i][j]
board[i][j] = 0
if board[i][cursor] == 0:
board[i][cursor] = tmp
elif board[i][cursor] == tmp:
board[i][cursor] *= 2
cursor += 1
else:
cursor += 1
board[i][cursor] = tmp
return board
# 오른쪽으로 이동
def right(board):
for i in range(N):
cursor = N - 1
for j in range(N - 1, -1, -1):
if board[i][j] != 0:
tmp = board[i][j]
board[i][j] = 0
if board[i][cursor] == 0:
board[i][cursor] = tmp
elif board[i][cursor] == tmp:
board[i][cursor] *= 2
cursor -= 1
else:
cursor -= 1
board[i][cursor] = tmp
return board
# 위로 이동
def up(board):
for j in range(N):
cursor = 0
for i in range(1, N):
if board[i][j] != 0:
tmp = board[i][j]
board[i][j] = 0
if board[cursor][j] == 0:
board[cursor][j] = tmp
elif board[cursor][j] == tmp:
board[cursor][j] *= 2
cursor += 1
else:
cursor += 1
board[cursor][j] = tmp
return board
# 아래로 이동
def down(board):
for j in range(N):
cursor = N - 1
for i in range(N - 1, -1, -1):
if board[i][j] != 0:
tmp = board[i][j]
board[i][j] = 0
if board[cursor][j] == 0:
board[cursor][j] = tmp
elif board[cursor][j] == tmp:
board[cursor][j] *= 2
cursor -= 1
else:
cursor -= 1
board[cursor][j] = tmp
return board
# DFS 탐색
def dfs(n, arr):
global ans
if n == 5:
for i in range(N):
for j in range(N):
ans = max(ans, arr[i][j])
return
for i in range(4):
copy_arr = copy.deepcopy(arr)
if i == 0:
dfs(n + 1, left(copy_arr))
elif i == 1:
dfs(n + 1, right(copy_arr))
elif i == 2:
dfs(n + 1, up(copy_arr))
elif i == 3:
dfs(n + 1, down(copy_arr))
dfs(0, pan)
print(ans)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 1525. 퍼즐 / Python (0) | 2024.06.30 |
---|---|
Baekjoon 17387. 선분 교차 2 / Python (0) | 2024.06.30 |
Baekjoon 1918. 후위 표기식 / Python (0) | 2024.06.30 |
Baekjoon 1700. 멀티탭 스케줄링 / Python (0) | 2024.06.30 |