알고리즘/[Python] 백준

(Python) 백준 12100번: 2048 (Easy)

출처 :  https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.

www.acmicpc.net

 

(Python) 백준 12100번 2048 (Easy)

(Python) 백준 12100번: 2048 (Easy)


In [68]:
import copy
In [69]:
## 가장 큰 값 업데이트하기
def find_max(array):
    global maxv
    for i in range(N):
        for j in range(N):
            if maxv < array[i][j]: maxv = array[i][j]
In [70]:
## 왼쪽으로 이동
def move_left(board):
    for i in range(N):
        p = 0
        x = 0
        for q in range(N):
            if board[i][q] == 0: continue # 값이 0 이라면 건너뛴다
            if x == 0:                    # 기존에 담고있던 값이 없다면
                x = board[i][q]           # x에 값을 할당
            else:                         # 기존에 담고있는 값이 있다면
                if x == board[i][q]:      # 동일한 값이라면
                    board[i][p] = 2*x     # i번째 자리에 2x를 업데이트
                    p = p + 1             # p 한칸 이동
                    x = 0                 # x 초기화
                else:                     # 다른 값이라면
                    board[i][p] = x       # i번째 자리에 x값 입력
                    p = p + 1             # p 한칸 이동
                    x = board[i][q]       # 새로운 x값
            board[i][q] = 0               # 나중에 번거로운 작업을 없애주기 위한것
        if x != 0: board[i][p] = x        # 마지막으로 고려해줘야 할것
    return board
In [71]:
## 오른쪽으로 이동
def move_right(board):
    for i in range(N):
        p = N-1
        x = 0
        for q in range(N-1, -1, -1):
            if board[i][q] == 0: continue # 값이 0 이라면 건너뛴다
            if x == 0:                    # 기존에 담고있던 값이 없다면
                x = board[i][q]           # x에 값을 할당
            else:                         # 기존에 담고있는 값이 있다면
                if x == board[i][q]:      # 동일한 값이라면
                    board[i][p] = 2*x     # i번째 자리에 2x를 업데이트
                    p = p - 1             # p 한칸 이동
                    x = 0                 # x 초기화
                else:                     # 다른 값이라면
                    board[i][p] = x       # i번째 자리에 x값 입력
                    p = p - 1             # p 한칸 이동
                    x = board[i][q]       # 새로운 x값
            board[i][q] = 0               # 나중에 번거로운 작업을 없애주기 위한것
        if x != 0: board[i][p] = x        # 마지막으로 고려해줘야 할것
    return board
In [72]:
## 위쪽으로 이동
def move_up(board):
    for i in range(N):
        p = 0
        x = 0
        for q in range(N):
            if board[q][i] == 0: continue # 값이 0 이라면 건너뛴다
            if x == 0:                    # 기존에 담고있던 값이 없다면
                x = board[q][i]           # x에 값을 할당
            else:                         # 기존에 담고있는 값이 있다면
                if x == board[q][i]:      # 동일한 값이라면
                    board[p][i] = 2*x     # i번째 자리에 2x를 업데이트
                    p = p + 1             # p 한칸 이동
                    x = 0                 # x 초기화
                else:                     # 다른 값이라면
                    board[p][i] = x       # i번째 자리에 x값 입력
                    p = p + 1             # p 한칸 이동
                    x = board[q][i]       # 새로운 x값
            board[q][i] = 0               # 나중에 번거로운 작업을 없애주기 위한것
        if x != 0: board[p][i] = x        # 마지막으로 고려해줘야 할것
    return board
In [73]:
## 아래쪽으로 이동
def move_down(board):
    for i in range(N):
        p = N-1
        x = 0
        for q in range(N-1, -1, -1):
            if board[q][i] == 0: continue # 값이 0 이라면 건너뛴다
            if x == 0:                    # 기존에 담고있던 값이 없다면
                x = board[q][i]           # x에 값을 할당
            else:                         # 기존에 담고있는 값이 있다면
                if x == board[q][i]:      # 동일한 값이라면
                    board[p][i] = 2*x     # i번째 자리에 2x를 업데이트
                    p = p - 1             # p 한칸 이동
                    x = 0                 # x 초기화
                else:                     # 다른 값이라면
                    board[p][i] = x       # i번째 자리에 x값 입력
                    p = p - 1             # p 한칸 이동
                    x = board[q][i]       # 새로운 x값
            board[q][i] = 0               # 나중에 번거로운 작업을 없애주기 위한것
        if x != 0: board[p][i] = x        # 마지막으로 고려해줘야 할것
    return board
In [74]:
def dfs(dfs_board, n): # 이동횟수(n)
    if n == 5:
        find_max(dfs_board)
        return
    dfs(move_left(copy.deepcopy(dfs_board)), n+1)
    dfs(move_right(copy.deepcopy(dfs_board)), n+1)
    dfs(move_up(copy.deepcopy(dfs_board)), n+1)
    dfs(move_down(copy.deepcopy(dfs_board)), n+1)
In [75]:
if __name__ == '__main__':
    N = int(input())
    maxv = 0
    map_board = [list(map(int, input().split())) for _ in range(N)]
    dfs(map_board, 0)
    print(maxv)
3
2 2 2
4 4 4
8 8 8
16