알고리즘

Python - 2048 (Easy) (12100) 구현, 브루트포스

jun.s.gi 2023. 6. 6. 22:23
728x90

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

 

12100번: 2048 (Easy)

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

www.acmicpc.net

*** 위치 정렬 -> 합 -> 위치 정렬 ***

0. 위로 이동하면 위에서부터 아래로 위치 정렬 후 합하고 다시 위치정렬

1. 아래로 이동하면 아래에서부터 위로 위치 정렬 후 합하고 다시 위치정렬

2. 왼쪽으로 이동하면 왼쪽에서부터 오른쪽으로 위치 정렬 후 합하고 다시 위치정렬

3. 오른쪽으로 이동하면 오른쪽에서부터 왼쪽으로 위치 정렬 후 합하고 다시 위치정렬

 

key

 - 0 : 상

 - 1 : 하

 - 2 : 좌

 - 3 : 우

import sys
import copy

# 위치 정렬 (빈칸 채우기)
def position(CopyMap, key):
    # 좌 또는 우로 움직였다면
    if key == 2 or key == 3:
        for x in CopyMap:
            for y in range(len(CopyMap)):

                if key == 2 and x[y] == 0:
                    for k in range(y + 1, len(CopyMap)):
                        if x[k]:
                            x[y], x[k] = x[k], 0
                            break

                elif key == 3 and x[len(CopyMap) - 1 - y] == 0:
                    for k in range(len(CopyMap) - 2 - y, -1, -1):
                        if x[k]:
                            x[len(CopyMap) - 1 - y], x[k] = x[k], 0
                            break

    # 상 또는 하로 움직였다면
    elif key == 1 or key == 0:
        for x in range(len(CopyMap)):
            for y in range(len(CopyMap)):
                
                if key == 0 and CopyMap[y][x] == 0:
                    for k in range(y + 1, len(CopyMap)):
                        if CopyMap[k][x]:
                            CopyMap[y][x], CopyMap[k][x] = CopyMap[k][x], 0
                            break
                            
                elif key == 1 and CopyMap[len(CopyMap) - 1 - y][x] == 0:
                    for k in range(len(CopyMap) - 2 - y, -1, -1):
                        if CopyMap[k][x]:
                            CopyMap[len(CopyMap) - 1 - y][x], CopyMap[k][x] = CopyMap[k][x], 0
                            break

    return CopyMap

# key의 방향에 움직입니다.
def sum2048(CopyMap, key):

    CopyMap = position(CopyMap, key)
    # 1. 아래로 이동 시키면 sum 함수는 밑에서 위로 탐색합니다. (n - 2 부터)
    # 3. 오른쪽으로 이동하면 sum 함수는 오른쪽에서 왼쪽으로 탐색 (n - 2 부터)
    if key == 1 or key == 3:
        for x in range(len(CopyMap) - 2, -1, -1):
            for y in range(0, len(CopyMap)):
                
                if key == 1 and CopyMap[x][y] == CopyMap[x + 1][y]:
                    CopyMap[x][y], CopyMap[x + 1][y] = 0, CopyMap[x][y] * 2
                    

                elif key == 3 and CopyMap[y][x] == CopyMap[y][x + 1]:
                    CopyMap[y][x], CopyMap[y][x + 1] = 0, CopyMap[y][x + 1] * 2

    # 0. 위로 이동 시키면 sum 함수는 위에서 아래로 탐색합니다.(1부터)
    # 2. 왼쪽으로 이동하면 sum 함수는 왼쪽에서 오른쪽으로 탐색 (1부터)
    elif key == 2 or key == 0:
        for x in range(1, len(CopyMap)):
            for y in range(0, len(CopyMap)):
                
                if key == 0 and CopyMap[x][y] == CopyMap[x - 1][y]:
                    CopyMap[x][y], CopyMap[x - 1][y] = 0, CopyMap[x][y] * 2
                    

                elif key == 2 and CopyMap[y][x] == CopyMap[y][x - 1]:
                    CopyMap[y][x], CopyMap[y][x - 1] = 0, CopyMap[y][x - 1] * 2

    CopyMap = position(CopyMap, key)
    return CopyMap


def solution(cnt, CopyMap):
    if cnt == 5:
        for i in CopyMap:
            if ans[0] < max(i):
                ans[0] = max(i)
        return
    
    for key in range(4):
        solution(cnt + 1, sum2048(copy.deepcopy(CopyMap), key))



map2048 = []
ans = [2]
n = int(sys.stdin.readline().strip())
for i in range(n):
    map2048.append(list(map(int, sys.stdin.readline().strip().split())))
solution(0, map2048)
print(ans[0])
728x90