https://www.acmicpc.net/problem/12100
import sys
import copy
input=sys.stdin.readline
n=int(input())
board=[list(map(int,input().split())) for _ in range(n)]
def turnByCnt(board,T):
tmp=copy.deepcopy(board)
new_board=[[0]*n for _ in range(n)]
for t in range(T):
for i in range(n):
for j in range(n):
new_board[j][n-1-i]=tmp[i][j]
tmp=copy.deepcopy(new_board)
return tmp
def play2048(board):
for i in range(n):
arr=[]
for j in range(n):
if board[i][j]!=0:
arr.append(board[i][j])
tmp=[]
k=0
while k<len(arr):
if k+1>=len(arr):
tmp.append(arr[k])
break
if arr[k]==arr[k+1]:
tmp.append(arr[k]*2)
k+=2
elif arr[k]!=arr[k+1]:
tmp.append(arr[k])
k+=1
board[i]=tmp+[0]*(n-len(tmp))
def dfs(deep,board):
global answer
if deep==5:
maxBlock=0
for i in range(n):
maxBlock=max(max(board[i]),maxBlock)
answer=max(maxBlock,answer)
return
for i in range(4):
new_board=turnByCnt(board,i)
play2048(new_board)
dfs(deep+1,new_board)
answer=0
dfs(0,board)
print(answer)
2048이라는 게임을 단순화하여 문제로 나타낸 문제이다. 현재 주어진 보드를 최대 5번 움직여서 만들어지는 최대 숫자를 구하는 문제이므로 DFS를 통해 5번의 모든 상황을 시뮬레이션 해볼 수 있다고 생각할 수 있다.
먼저 기본적인 틀을 DFS를 통해 만들어준다. 5번의 게임 진행이 전부 끝나면 보드에서 가장 큰 숫자를 찾아서 현재의 답을 갱신시켜준다. 그렇지 않을 경우 4가지 방향으로 게임을 전부 수행해야 하는데 여기서 간단히 한쪽 방향으로만 게임을 만들어놓고 보드를 돌려버림으로써 모든 방향을 동일하게 수행할 수 있다.
보드를 돌리는 과정은 총 4가지로 나누어서 좌표에 따라 배열 돌리기를 통하여 돌려주면 된다. 그런 후, 게임을 수행하는 play2048
을 구현해주면 되는데, 한쪽 방향만 구현하면 되므로 먼저 처리해야 할 한줄 씩 가져오면 된다. 이 때, 아이디어 자체는 간단하다. 먼저 한쪽으로 몰리기 때문에 0은 필요가 없다. 그러므로 0을 제외한 나머지 숫자들만 가져와서 배열을 만든다. 이 배열을 탐색하면서 작업을 수행하는데, 앞에서부터 읽으면서 앞과 뒤가 같을 경우에 index를 +2해주고 합쳐진 수를 정답 배열에 넣어준다. 만약 다를 경우에는 +1만 index를 해주고 현재의 수를 넣는다. 이런식으로 처리하면 한쪽으로 2048이 진행된 배열이 완성되며 여기다가 이 배열의 길이의 남은 만큼의 0으로 길이를 늘려서 배치해주면 된다.
이렇게 Python로 백준의 "2048 (Easy)" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊