[코딩테스트][백준] 🔥 백준 12100번 "2048 (Easy)" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 9월 1일
0
post-thumbnail

문제 링크

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

🕒 Python 풀이시간: 35분

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: 최대 숫자에 도전하라!

2048이라는 게임을 단순화하여 문제로 나타낸 문제이다. 현재 주어진 보드를 최대 5번 움직여서 만들어지는 최대 숫자를 구하는 문제이므로 DFS를 통해 5번의 모든 상황을 시뮬레이션 해볼 수 있다고 생각할 수 있다.

먼저 기본적인 틀을 DFS를 통해 만들어준다. 5번의 게임 진행이 전부 끝나면 보드에서 가장 큰 숫자를 찾아서 현재의 답을 갱신시켜준다. 그렇지 않을 경우 4가지 방향으로 게임을 전부 수행해야 하는데 여기서 간단히 한쪽 방향으로만 게임을 만들어놓고 보드를 돌려버림으로써 모든 방향을 동일하게 수행할 수 있다.

보드를 돌리는 과정은 총 4가지로 나누어서 좌표에 따라 배열 돌리기를 통하여 돌려주면 된다. 그런 후, 게임을 수행하는 play2048을 구현해주면 되는데, 한쪽 방향만 구현하면 되므로 먼저 처리해야 할 한줄 씩 가져오면 된다. 이 때, 아이디어 자체는 간단하다. 먼저 한쪽으로 몰리기 때문에 0은 필요가 없다. 그러므로 0을 제외한 나머지 숫자들만 가져와서 배열을 만든다. 이 배열을 탐색하면서 작업을 수행하는데, 앞에서부터 읽으면서 앞과 뒤가 같을 경우에 index를 +2해주고 합쳐진 수를 정답 배열에 넣어준다. 만약 다를 경우에는 +1만 index를 해주고 현재의 수를 넣는다. 이런식으로 처리하면 한쪽으로 2048이 진행된 배열이 완성되며 여기다가 이 배열의 길이의 남은 만큼의 0으로 길이를 늘려서 배치해주면 된다.

이렇게 Python로 백준의 "2048 (Easy)" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글