본문 바로가기

백준 문제풀이 코드저장소/Gold

Baekjoon 12100. 2048 (Easy) / Python

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)

 

반응형