[백준/Python] 12100 2048 (Easy)

알고리즘 - 2048 (Easy)

Posted by Kyun2da on September 26, 2020

1️⃣ 서론

백준 문제 12100번 2048 (Easy) 입니다. 파이썬(Python)으로 풀었습니다.

2️⃣ 문제 설명

링크 이와 같은 게임을 구현하는 문제입니다.

단, 이동은 최대 5번 시켜서 얻을 수 있는 가장 큰 블록을 출력하는 문제입니다.

3️⃣ 풀이

상하좌우 4번의 경우로 5번씩 이동시키므로 경우의 수는 $4^{5}$ 가지 입니다.

이를 dfs를 활용하여 이동시켜 나올 수 있는 가장 큰 블록을 출력하는 문제였습니다.

dfs를 구현하는건 쉬웠는데 블록을 이동하는 함수를 만드는 것이 상당히 까다로웠습니다.

옮기는 경우의 수는 3가지로 다음과 같습니다.

  1. 앞의 숫자가 0이라면 자신의 숫자를 앞의 숫자에 옮깁니다.
  2. 앞의 숫자가 자신과 같다면 앞의숫자의 두배를 해줍니다.
  3. 앞의 숫자와 자신이 다르면 인덱스를 하나 늘리고 그자리에 넣어줍니다.

그럼 소스코드를 보시겠습니다.

4️⃣ 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import sys
import copy

n = int(input())

arr = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
ans = 0
#print(arr)


def move(idx):
    # 0부터 3까지 상,하,좌,우 를 의미
    if idx == 0:
        for j in range(n):
            idx = 0
            for i in range(1, n):
                if arr[i][j]:
                    temp = arr[i][j]
                    arr[i][j] = 0
                    if arr[idx][j] == 0:
                        arr[idx][j] = temp
                    elif arr[idx][j] == temp:
                        arr[idx][j] = temp * 2
                        idx += 1
                    else:
                        idx += 1
                        arr[idx][j] = temp
    elif idx == 1:
        for j in range(n):
            idx = n - 1
            for i in range(n - 2, -1, -1):
                if arr[i][j]:
                    temp = arr[i][j]
                    arr[i][j] = 0
                    if arr[idx][j] == 0:
                        arr[idx][j] = temp
                    elif arr[idx][j] == temp:
                        arr[idx][j] = temp * 2
                        idx -= 1
                    else:
                        idx -= 1
                        arr[idx][j] = temp

    elif idx == 2:
        for i in range(n):
            idx = 0
            for j in range(1, n):
                if arr[i][j]:
                    temp = arr[i][j]
                    arr[i][j] = 0
                    if arr[i][idx] == 0:
                        arr[i][idx] = temp
                    elif arr[i][idx] == temp:
                        arr[i][idx] = temp * 2
                        idx += 1
                    else:
                        idx += 1
                        arr[i][idx] = temp

    else:
        for i in range(n):
            idx = n - 1
            for j in range(n - 2, -1, -1):
                if arr[i][j]:
                    temp = arr[i][j]
                    arr[i][j] = 0
                    if arr[i][idx] == 0:
                        arr[i][idx] = temp
                    elif arr[i][idx] == temp:
                        arr[i][idx] = temp * 2
                        idx -= 1
                    else:
                        idx -= 1
                        arr[i][idx] = temp


def dfs(count):
    global ans, arr
    if count == 5:
        for i in range(n):
            ans = max(ans, max(arr[i]))
        return

    tmp = copy.deepcopy(arr)
    for i in range(4):
        move(i)
        dfs(count + 1)
        arr = copy.deepcopy(tmp)


dfs(0)
print(ans)

5️⃣ 마치며..

질문과 지적은 환영합니다. 이 문제는 최적의 정답일 수도 아닐수도 있습니다.
궁금한게 있으시면 아래 댓글 남겨주세요.🙏
댓글은 저에게 큰 힘이 됩니다!
감사합니다. ❤️