1
+ import sys
2
+ input = sys .stdin .readline
3
+
4
+ """
5
+ [2048 (Easy)]
6
+
7
+ - 상, 하, 좌, 우로 이동하는 경우에 대해 최대 5번 이동시키는 모든 경우를 구한 후, 가장 큰 블록 찾는 문제 - 백트래킹
8
+ - 움직이는 함수는 하나만 짜고, 보드를 돌려가면서 상, 하, 좌, 우 모든 방향의 움직임을 만듦
9
+
10
+ - 상 <-> 하: 행 순서를 뒤집어서 해결
11
+ - 상/하 <-> 좌/우: Transpose Matrix 활용
12
+
13
+ - ex. 2 2 1 를 상, 하, 좌, 우로 이동하는 경우 구하는 법
14
+ 2 2 2
15
+ 4 4 4
16
+ -상: 원래 배열에서 상으로 움직이는 함수 실행
17
+ 2 2 1 4 4 1
18
+ 2 2 2 -> 4 4 2
19
+ 4 4 4 0 0 4
20
+ -하: 원래 배열의 행 순서를 뒤집은 후, 상으로 움직이는 함수 실행
21
+ 2 2 1 4 4 4 4 4 4
22
+ 2 2 2 -> 2 2 2 -> 4 4 2
23
+ 4 4 4 2 2 1 0 0 1
24
+ -좌: 원래 배열의 전치 행렬을 구한 후, 상으로 움직이는 함수 실행
25
+ 2 2 1 2 2 4 4 4 8
26
+ 2 2 2 -> 2 2 4 -> 1 2 4
27
+ 4 4 4 1 2 4 0 0 0
28
+ -우: 원래 배열의 전치 행렬에서 행 순서를 뒤집은 후, 상으로 움직이는 함수 실행
29
+ 2 2 1 1 2 4 1 4 8
30
+ 2 2 2 -> 2 2 4 -> 4 2 4
31
+ 4 4 4 2 2 4 0 0 0
32
+
33
+ - zip(): 두개 이상의 iterable한 객체를 인자로 받아서, 순서대로 하나씩 묶어서 반환한다.
34
+ ex) zip([1, 2, 3], ['a', 'b', 'c']) -> [1, 'a'], [2, 'b'], [3, 'c']
35
+ 따라서 zip의 인자로 각 행을 넣어주면, 행과 열이 바뀐 Transpose matrix가 나오게 된다.
36
+ """
37
+
38
+ def up (board ):
39
+ """
40
+ 위로 움직이는 함수
41
+ 한 열씩 검사하면서 위의 행부터 2개씩 같은 거 있다면 합치기
42
+ 이때 블록 없는 부분은 넘어가고, 블록이 존재했던 값을 저장해서 비교하는 것이 중요!
43
+ """
44
+ temp = [[0 ]* n for _ in range (n )]
45
+ for c in range (n ):
46
+ idx = 0
47
+ prev = 0
48
+ for r in range (n ):
49
+ if not board [r ][c ]:
50
+ continue
51
+ if board [r ][c ] == prev :
52
+ temp [idx - 1 ][c ] *= 2
53
+ prev = 0
54
+ else :
55
+ temp [idx ][c ] = board [r ][c ]
56
+ prev = board [r ][c ]
57
+ idx += 1
58
+
59
+ return temp
60
+
61
+ def backtracking (cnt , board ):
62
+ global ans
63
+ if cnt == 5 :
64
+ for line in board :
65
+ ans = max (ans , max (line ))
66
+ return
67
+
68
+ # Transpose matrix 구하기 (상 -> 좌)
69
+ board_t = list (zip (* board ))
70
+
71
+ # 상
72
+ backtracking (cnt + 1 , up (board ))
73
+ # 하
74
+ backtracking (cnt + 1 , up (board [::- 1 ]))
75
+ # 좌
76
+ backtracking (cnt + 1 , up (board_t ))
77
+ # 우
78
+ backtracking (cnt + 1 , up (board_t [::- 1 ]))
79
+
80
+ return
81
+
82
+ # 입력
83
+ n = int (input ())
84
+ board = [list (map (int , input ().split ())) for _ in range (n )]
85
+
86
+ ans = 0
87
+ backtracking (0 , board )
88
+
89
+ # 출력
90
+ print (ans )
0 commit comments