상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 12100번: 2048 (삼성 A형 기출 문제)

Python/문제풀이 (삼성 A형 대비)

by 코딩하는 낙타 2020. 2. 11. 14:32

본문

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

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.

www.acmicpc.net

 

내 풀이:

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
94
95
96
97
98
99
100
101
102
103
def move(lst, arr):
    global N
    for dir in lst:
        if dir == 0:
            for j in range(N):
                s = 0
                cnt_i = 0
                for i in range(N):
                    if arr[i][j] != 0:
                        if s != arr[i][j]:
                            pre = arr[i][j]
                            arr[i][j] = 0
                            arr[cnt_i][j] = pre
                            s = pre
                            cnt_i += 1
                        elif s == arr[i][j]:
                            arr[cnt_i - 1][j] = s * 2
                            arr[i][j] = 0
                            s = 0
        elif dir == 2:
            for j in range(N):
                s = 0
                cnt_i = N-1
                for i in range(N-1-1-1):
                    if arr[i][j] != 0:
                        if s != arr[i][j]:
                            pre = arr[i][j]
                            arr[i][j] = 0
                            arr[cnt_i][j] = pre
                            s = pre
                            cnt_i -= 1
                        elif s == arr[i][j]:
                            arr[cnt_i + 1][j] = s * 2
                            arr[i][j] = 0
                            s = 0
 
        elif dir == 1:
            for i in range(N):
                s = 0
                cnt_j = N-1
                for j in range(N-1-1-1):
                    if arr[i][j] != 0:
                        if s != arr[i][j]:
                            pre = arr[i][j]
                            arr[i][j] = 0
                            arr[i][cnt_j] = pre
                            s = pre
                            cnt_j -= 1
                        elif s == arr[i][j]:
                            arr[i][cnt_j + 1= s * 2
                            arr[i][j] = 0
                            s = 0
 
        elif dir == 3:
            for i in range(N):
                s = 0
                cnt_j = 0
                for j in range(N):
                    if arr[i][j] != 0:
                        if s != arr[i][j]:
                            pre = arr[i][j]
                            arr[i][j] = 0
                            arr[i][cnt_j] = pre
                            s = pre
                            cnt_j += 1
                        elif s == arr[i][j]:
                            arr[i][cnt_j - 1= s * 2
                            arr[i][j] = 0
                            s = 0
 
 
def order(idx, lst):
    global N, ans
    if idx == 4:
        arr = [arr_init[_][:] for _ in range(N)]
        move(lst, arr)
        result = 0
        for i in range(N):
            for j in range(N):
                if arr[i][j] > result:
                    result = arr[i][j]
        if ans < result:
            ans = result
        return
 
    for i in range(4):
        lst.append(i)
        order(idx+1, lst)
        lst.pop()
 
 
= int(input())
arr_init = [list(map(int,input().split())) for _ in range(N)]
 
dy = [-1010]
dx = [010-1]
ans = 0
 
for i in range(4):
    order(0, [i])
 
 
print(ans)
 

Python3, 520ms

번호를 이동시키는 방향에 따라 몰리는 쪽부터 탐색해서 채워야 하기 때문에 상하좌우 4개의 방향에 대해 if문으로 코드를 짰다. 마지막 수를 s에 저장했다가 같은 수가 나오면 저장할 자리(cnt로 기억)에 2배 값을 넣는 것으로 문제를 해결했다. 코드 길이에 비해 복붙을 이용해서 코딩 시간은 생각보다 길지 않았던 문제이다.

관련글 더보기

댓글 영역