[๋ฐฑ์ค] 12100๋ฒ: 2048 (Easy)
๐ ๋ฌธ์
https://www.acmicpc.net/problem/12100
๐ ์ค๋ช
๋ณด๋์ ํฌ๊ธฐ์ ์ด๋ ํ์๊ฐ ์ถฉ๋ถํ ์์ผ๋ฏ๋ก ๋ฐฑํธ๋ํน์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. ๊น๋ค๋ก์ ๋ ๋ถ๋ถ์ ์, ํ, ์ข, ์ฐ๋ก ๋ถ๋ก์ ์ด๋์ํค๋ ๊ฒ์ด์๋ค. ์ฒ์์๋ ๋ชจ๋ ์ด๋ ๋ฐฉํฅ์ ๋ํ ์์ง์์ ์ผ์ผํ ์์ฑํ๋๋ฐ, ์ฝ๋๊ฐ ๋งค์ฐ ๊ธธ์ด์ก๋ค .. ๋ฐ๋ผ์ ๋ธ๋ก ์์ง์์ ๋ํ ์ฝ๋๋ ์๋ก ์์ง์ด๋ ๊ฒฝ์ฐ๋ก ํ์ ํ์ฌ ์์ฑํ์๊ณ ๋๋จธ์ง ๋ฐฉํฅ์ ๋ณด๋๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ผ๋ก ๊ตฌํํ์๋ค.
์ต๋ 5๋ฒ์ ์ด๋์ ๊ณ ๋ คํ๋ฉฐ, ๊ฐ ์ด๋์์ 4๊ฐ์ง ๋ฐฉํฅ์ผ๋ก ๋ถ๊ธฐ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์ ์ฒด ๊ฒฝ์ฐ์ ์๋ $4^5=1024$์ด๋ค. moveUp
, clockwise
, counterClockwise
ํจ์์ ์๊ฐ๋ณต์ก๋๋ $O(N^2)$์ด๋ค. ์ฆ, ๊ฐ ๋จ๊ณ์ ๊ฐ ๋ฐฉํฅ์ ์ฒ๋ฆฌํ ๋์ ์๊ฐ๋ณต์ก๋๋ $O(N^2)$์ด๋ค. ์ ์ฒด ์๊ฐ๋ณต์ก๋ ๋ํ $O(N^2)$์ด๋, ์ด ์ฐ์ฐ์ ์๋ฅผ ๊ณ์ฐํด๋ณด์๋ฉด $1024 \times 20^2=409600$์ผ๋ก, ์ด์จ๋ 1์ด ๋ด๋ก ์ํ ๊ฐ๋ฅํ๋ค.
๐ ์ฝ๋
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector <vector<int>> arr(20, vector<int>(20));
int ans;
// ๊ธฐ๋ณธ๊ฐ์ ์๋ก ์ด๋, ๋ค๋ฅธ ๋ฐฉํฅ์ผ ๊ฒฝ์ฐ arr๋ฅผ ํ์ ํ๋ค.
void moveUp() {
vector<vector<int>> moved(20, vector<int>(20));
for (int i = 0;i < n;i++) {
int able = 0;
int first = -1;
int second = -1;
for (int j = 0;j < n;j++) {
if (arr[j][i] != 0) {
if (first == -1)
first = arr[j][i];
else if (second == -1) {
second = arr[j][i];
if (first == second) {
moved[able][i] = first + second;
able++;
first = -1;
second = -1;
}
else {
moved[able][i] = first;
able++;
first = second;
second = -1;
}
}
}
if (j == n - 1 && first != -1) {
moved[able][i] = first;
}
}
}
arr = moved;
}
// arr๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 1ํ์
void clockwise() {
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
swap(arr[i][j], arr[j][i]);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
swap(arr[i][j], arr[i][n - j - 1]);
}
}
}
// arr๋ฅผ ์๊ณ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก 1ํ์
void counterClockwise() {
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
swap(arr[i][j], arr[j][i]);
}
}
for (int j = 0; j < n; j++) {
for (int i = 0; i < n / 2; i++) {
swap(arr[i][j], arr[n - i - 1][j]);
}
}
}
void dfs(int k) {
if (k == 5) {
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
ans = ans > arr[i][j] ? ans : arr[i][j];
}
}
return;
}
vector<vector<int>> origin = arr;
// ์
moveUp();
dfs(k + 1);
arr = origin;
// ํ
clockwise();
clockwise();
moveUp();
counterClockwise();
counterClockwise();
dfs(k + 1);
arr = origin;
// ์ข
clockwise();
moveUp();
counterClockwise();
dfs(k + 1);
arr = origin;
// ์ฐ
counterClockwise();
moveUp();
clockwise();
dfs(k + 1);
arr = origin;
}
int main() {
cin >> n;
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
cin >> arr[i][j];
}
}
dfs(0);
cout << ans;
}