top of page

소스 코드 제출

공개·회원 72명

손유준손유준

20251213

import sys

input = sys.stdin.readline


N = int(input())

global_ans = 0

board = []

for _ in range(N):

    board.append(list(map(int, input().split())))


def merged(line): #왼쪽으로 움직여서 병합함

    arr = [x for x in line if x != 0]

    changed = []

    i = 0

    while i < len(arr):

        if i + 1 < len(arr) and arr[i] == arr[i + 1]:

            changed.append(arr[i] * 2)

            i += 2

        else:

            changed.append(arr[i])

            i += 1

    changed += [0] * (len(line) - len(changed))

    return changed


def move_left(bd):

    new = [row[:] for row in bd]

    changed = False

    for i in range(N):

        line = new[i]

        mgd_line = merged(line)

        if line != mgd_line:

            changed = True

            new[i] = mgd_line

    return new if changed else None


def move_right(bd):

    new = [row[:] for row in bd]

    changed = False

    for i in range(N):

        orginal = new[i]

        rev = orginal[::-1]

        mgd_line = merged(rev)[::-1]

        if orginal != mgd_line:

            changed = True

            new[i] = mgd_line

    return new if changed else None


def move_up(bd):

    new = [row[:] for row in bd]

    changed = False

    for j in range(N):

        line = [new[i][j] for i in range(N)]

        mgd_line = merged(line)

        if line != mgd_line:

            changed = True

            for i in range(N):

                new[i][j] = mgd_line[i]

    return new if changed else None


def move_down(bd):

    new = [row[:] for row in bd]

    changed = False

    for j in range(N):

        original = [new[i][j] for i in range(N)]

        mgd_line = merged(original[::-1])[::-1]

        if original != mgd_line:

            changed = True

            for i in range(N):

                new[i][j] = mgd_line[i]

    return new if changed else None


def move(bd, mode):

    if mode == 0:

        return move_up(bd)

    elif mode == 1:

        return move_down(bd)

    elif mode == 2:

        return move_left(bd)

    else:

        return move_right(bd)


def dfs(board: list, depth: int): #dfs함수

    global global_ans

    max_tile = 0

    for row in board:

        max_tile = max(max_tile, max(row))

    global_ans = max(global_ans, max_tile)

    if depth == 10:

        return

    if max_tile  (2 * (10 - depth)) <= global_ans:

        return

    for k in range(4):

        nxt = move(board, k)

        if nxt is None:

            continue

        dfs(nxt, depth + 1)


dfs(board, 0)

print(global_ans)

12회 조회
주소 : 경기도 용인시 광교중앙로 302 블루 스퀘어 602호
연락처 : 031) 216 - 1546 ,     031) 215 - 1546
사업자등록번호 : 465-92-00916
​학원 등록 제 4603호
bottom of page