Algorithm/Baekjoon

BOJ 12100 2048 (Easy) Python3

Bonita SY 2023. 6. 27. 15:59
728x90

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

 

12100번: 2048 (Easy)

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

www.acmicpc.net

 

 

 

 

import sys
input = sys.stdin.readline

N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]

result = 0

def deep_copy_board(board):
    newBoard = []
    for i in range(N):
        elems = []
        for j in range(N):
            elems.append(board[i][j])
        newBoard.append(elems)
    return newBoard
def move(cur_board, cnt):
    if cnt >= 5:
        global result
        for x in range(N):
            for y in range(N):
                result = max(result, cur_board[x][y])
        return

    # top
    newBoard = deep_copy_board(cur_board)

    for y in range(N):
        hasReposition = False
        for x in range(N-1):
            if newBoard[x][y] == 0:
                hasReposition = True
                continue
            for nx in range(x+1, N):
                if newBoard[nx][y] == 0:
                    hasReposition = True
                    continue
                elif newBoard[x][y] == newBoard[nx][y]:
                    newBoard[x][y] *= 2
                    newBoard[nx][y] = 0
                    hasReposition = True
                    break
                else:
                    break

        if hasReposition:
            newElem = []
            for x in range(N):
                if newBoard[x][y] != 0:
                    newElem.append(newBoard[x][y])
            while len(newElem) < N:
                newElem.append(0)
            for x in range(N):
                newBoard[x][y] = newElem[x]

    move(newBoard, cnt+1)

    # bottom
    newBoard = deep_copy_board(cur_board)

    for y in range(N):
        hasReposition = False
        for x in range(N-1, 0, -1):
            if newBoard[x][y] == 0:
                hasReposition = True
                continue
            for nx in range(x-1, -1, -1):
                if newBoard[nx][y] == 0:
                    hasReposition = True
                    continue
                elif newBoard[x][y] == newBoard[nx][y]:
                    newBoard[x][y] *= 2
                    newBoard[nx][y] = 0
                    hasReposition = True
                    break
                else:
                    break

        if hasReposition:
            newElem = []
            for x in range(N-1, -1, -1):
                if newBoard[x][y] != 0:
                    newElem.append(newBoard[x][y])
            while len(newElem) < N:
                newElem.append(0)
            i = 0
            for x in range(N-1, -1, -1):
                newBoard[x][y] = newElem[i]
                i += 1

    move(newBoard, cnt + 1)

    # left
    newBoard = deep_copy_board(cur_board)

    for x in range(N):
        hasReposition = False
        for y in range(N - 1):
            if newBoard[x][y] == 0:
                hasReposition = True
                continue
            for ny in range(y + 1, N):
                if newBoard[x][ny] == 0:
                    hasReposition = True
                    continue
                elif newBoard[x][y] == newBoard[x][ny]:
                    newBoard[x][y] *= 2
                    newBoard[x][ny] = 0
                    hasReposition = True
                    break
                else:
                    break

        if hasReposition:
            newElem = []
            for y in range(N):
                if newBoard[x][y] != 0:
                    newElem.append(newBoard[x][y])
            while len(newElem) < N:
                newElem.append(0)
            for y in range(N):
                newBoard[x][y] = newElem[y]

    move(newBoard, cnt + 1)

    # right
    newBoard = deep_copy_board(cur_board)

    for x in range(N):
        hasReposition = False
        for y in range(N-1, 0, -1):
            if newBoard[x][y] == 0:
                hasReposition = True
                continue
            for ny in range(y-1, -1, -1):
                if newBoard[x][ny] == 0:
                    hasReposition = True
                    continue
                elif newBoard[x][y] == newBoard[x][ny]:
                    newBoard[x][y] *= 2
                    newBoard[x][ny] = 0
                    hasReposition = True
                    break
                else:
                    break

        if hasReposition:
            newElem = []
            for y in range(N-1, -1, -1):
                if newBoard[x][y] != 0:
                    newElem.append(newBoard[x][y])
            while len(newElem) < N:
                newElem.append(0)
            i = 0
            for y in range(N-1, -1, -1):
                newBoard[x][y] = newElem[i]
                i += 1

    move(newBoard, cnt + 1)

if N == 1:
    result = board[0][0]
else:
    move(board, 0)
print(result)
728x90