본문 바로가기
Algorithm(CodeTree, Python)/Simulation

[코드트리] 단 한 번의 2048 시도 Python

by kurooru 2023. 1. 19.
# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(4)
]
# order 입력
order = input()

# 함수들
# do_merge(o)
def do_merge(o):
    # 오른쪽으로 밀었다면,
    if o == 'R':
        # 전체 행을 조사
        for i in range(4):
            # 각 행에서
            for j in range(3, 0, -1):
                # 앞뒤가 같은 부분이 있으면,
                if grid[i][j] == grid[i][j-1]:
                    # 해당 부분은 2배가 되고,
                    grid[i][j] = grid[i][j] * 2
                    # 다음 부분은 0이됨
                    grid[i][j-1] = 0
                    # 다시 밀기
                    push(o)
    
    # 왼쪽으로 밀었다면,
    elif o == 'L':
        # 전체 행을 조사
        for i in range(4):
            # 각 행에서
            for j in range(3):
                # 앞뒤가 같은 부분이 있으면,
                if grid[i][j] == grid[i][j+1]:
                    # 해당 부분은 2배가 되고
                    grid[i][j] = grid[i][j] * 2
                    # 다음 부분은 0이 됨
                    grid[i][j+1] = 0
                    # 다시 밀어주기
                    push(o)
    
    # 위로 밀었다면,
    elif o == 'U':

        # 전체 열을 조사
        for i in range(4):
            # 각 열에서
            for j in range(3):
                # 앞 뒤가 같은 부분이 있으면
                if grid[j][i] == grid[j+1][i]:
                    # 해당 부분은 2배가 되고
                    grid[j][i] = grid[j+1][i] * 2
                    # 다음 부분은 0이 됨
                    grid[j+1][i] = 0
                    # 다시 밀어주기
                    push(o)
    
    # 아래쪽으로 밀었다면
    else:
        # 모든 열을 조사
        for i in range(4):
            # 각 열에서
            for j in range(3, 0, -1):
                # 앞 뒤가 같은 것을 찾으면
                if grid[j][i] == grid[j-1][i]:
                    # 해당 위치는 2배가 되고
                    grid[j][i] = grid[j][i] * 2
                    # 다음 위치는 0이 됨
                    grid[j-1][i] = 0
                    # 다시 밀어주기
                    push(o)


# 함수들
def push(o):
    
    # 오른쪽으로 밀 경우
    if o == 'R':
        # 전체 행을 조사
        for i in range(4):
            
            # temp
            temp = []
            
            # 해당 열에서
            for j in range(3, -1, -1):
                # 숫자가 있으면
                if grid[i][j]:
                    # temp에 추가
                    temp.append(grid[i][j])
            
            # shortage
            shortage = 4 - len(temp)
            for _ in range(shortage):
                temp.append(0)
            
            # grid의 각 행을 바꿔주기
            for j in range(4):
                grid[i][j] = temp[3-j]
    
    # 왼쪽으로 밀 경우
    elif o == 'L':
        # 전체 행을 조사
        for i in range(4):

            # temp
            temp = []

            # 해당 열에서
            for j in range(4):
                # 숫자가 있으면
                if grid[i][j]:
                    # temp에 추가
                    temp.append(grid[i][j])
            
            # shortage
            shortage = 4 - len(temp)
            for _ in range(shortage):
                temp.append(0)
            
            # grid 교체
            for j in range(4):
                grid[i][j] = temp[j]
    
    # 위로 밀 경우
    elif o == 'U':

        # 전체 열을 조사
        for i in range(4):
            
            # temp 
            temp = []
            
            # 해당행에서
            for j in range(4):
                # 숫자가 존재하면
                if grid[j][i]:
                    # temp에 추가
                    temp.append(grid[j][i])
            
            # shortage
            shortage = 4 - len(temp)
            for _ in range(shortage):
                temp.append(0)

            # grid 바꿔주기
            for j in range(4):
                grid[j][i] = temp[j]

    # 아래로 밀 경우
    else:

        # 모든 열을 조사
        for i in range(4):

            # temp
            temp = []

            # 각 행에서
            for j in range(3, -1, -1):
                # 숫자가 존재한다면
                if grid[j][i]:
                    # temp에 추가
                    temp.append(grid[j][i])
            
            # shortage
            shortage = 4 - len(temp)
            for _ in range(shortage):
                temp.append(0)
            
            # grid 바꿔주기
            for j in range(4):
                grid[j][i] = temp[3-j]

# 설계
# push(order) -> 밀기
push(order)

# do_merge(order) -> 합쳐주기
do_merge(order)

# 출력
for i in range(4):
    for j in range(4):
        print(grid[i][j], end= ' ')
    print()