[백준] 12100 : 2048 - Python

Chooooo·2024년 3월 23일
0

알고리즘/백준

목록 보기
143/182

코드

import sys
sys.stdin = open("input.txt", "rt")

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

def move(g): # ! 해당 보드 왼쪽으로 밀기
    temp = [[0] * n for _ in range(n)]
    for i in range(n):
        flag = False # ! 연속 갱신 x -> 이전에 갱신이 있었는지 없었는지 확인하기 위해
        pos = -1 # ! 현재 조작 위치 (타겟점)
        for j in range(n):
            if g[i][j] == 0: continue # 값이 없으면 무시
            if flag == True and g[i][j] == temp[i][pos]: # ! 한번 값이 옮겨졌었고(flag == True) and 내가 지금 옮기려는 값과 지도에 옮겨져 있는 값이 같으면 업데이트
                flag = False # ! 값이 합쳐졌다는 소리
                temp[i][pos] *= 2
            else:
                pos += 1
                temp[i][pos] = g[i][j] # ! 아니라면 값만 복사
                flag = True
    return temp


def rotate_90(g):
    temp = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            temp[j][n-i-1] = g[i][j]
    return temp

MAX_VAL = -int(1e9)
def DFS(L, g):
    global MAX_VAL
    if L == 5:
        maxData = 0
        for i in range(n):
            temp = max(g[i])
            maxData = max(maxData, temp)
        MAX_VAL = max(MAX_VAL, maxData)
    else:
        for i in range(4):
            temp_g = move(g)
            DFS(L+1, temp_g)
            g = rotate_90(g)

DFS(0,g)
print(MAX_VAL)

코멘트

각 방향으로 이동 시 보드의 숫자 변화를 어떻게 처리할 것인가 ?
-> 위 질문을 생각해 봤어야 했다.

상하좌우 4개의 함수를 따로 처리해도 된다.
하지만 !! 어느 한 방향만 구현하고, 90도 돌리는 함수를 구현하면 됐다.

즉 다시 말하면,
기존 보드를 -> 밀면 오른쪽으로 민 것이다.
근데 기존 보드를 시계 방향으로 90도 회전 후 오른쪽으로 밀면 아래로 미는 것을 구현할 수 있다.

즉 한가지 방향만 구현하면 된다.

다시 생각하면, 각 방향으로 이동 시 보드의 숫자 변화를 어떻게 처리할 것인가 ? : 이 부분에 대해서 자세히 생각했어야 했음.

무엇보다도 move함수 구현 시뮬레이션 해보면서 생각해봤어야 했다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글