์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ๋ต ๋น์จ |
1 ์ด | 512 MB | 23.670% |
12100๋ฒ: 2048 (Easy)
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2
www.acmicpc.net
๋ฌธ์
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒ์ํ์ ์ด๊ธฐ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ์ ๋ํ๋ด๋ฉฐ, ์ด์ธ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋ก์ ๋ํ๋ธ๋ค. ๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1024๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ 2์ ์ ๊ณฑ๊ผด์ด๋ค. ๋ธ๋ก์ ์ ์ด๋ ํ๋ ์ฃผ์ด์ง๋ค.
์ต๋ 5๋ฒ ์ด๋์์ผ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ์ถ๋ ฅํ๋ค.
ํด๊ฒฐ
key point, N์ ํฌ๊ธฐ๊ฐ 20์ด๋ฏ๋ก ์์ ํ์ํ๋ค.
- go( ) ํจ์๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฅํ ์ด๋ํ์ 5๋ฒ ๋์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ์์ง์์ ๋ชจ๋ ํด๋ณธ๋ค.
- 4 * 4 * 4 * 4 * 4 = 1024 ๋ฒ์ ์ฐ์ฐ์ ํ์ฌ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ์ฐพ๋๋ค.
- ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ํด์ ์ธ์ ํ ์ซ์๋ค์ ๋น๊ตํ์ฌ ๊ฐ์ผ๋ฉด ํฉ์น๊ณ
- ๋น๊ณต๊ฐ๋ค์ ์ซ์๋ก ์ฑ์ธ ์ ์๋ค๋ฉด ์ฑ์ ๋ค.
- ์ซ์๊ฐ ๊ฐ์์ ํฉ์น ๋๋, chk๋ฐฐ์ด์ ์ด์ฉํด์ 1 ๋ณํํด์คฌ๊ณ , chk๊ฐ 0์ธ ์ซ์๋ค ๋ผ๋ฆฌ ํฉ์น ์ ์๊ฒ ํ๋ค.
3
2 2 2
4 4 4
8 8 8
16
9
4 2 0 0 0 0 0 0 0
4 8 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
8 4 0 0 0 0 0 0 0
8 2 0 0 0 0 0 0 0
64
3
0 8 1024
4 0 4
0 1024 32
2048
3
256 8 128
16 0 256
0 8 0
512
์ฝ๋
๋ฉ๋ชจ๋ฆฌ | ์๊ฐ |
1988 KB | 8 ms |
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
#include <iostream>
using namespace std;
int n, arr[25][25], Max;
void arr_copy(int a[][25], int arr[][25]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = arr[i][j];
}
}
}
void go(int arr[25][25], int d, int cnt) {
if (cnt > 5) {
return;
}
int a[25][25] = { 0 };
arr_copy(a, arr);
// ๋ง๋ค๊ณ ๋์ ํ์ฌ ๊ฐ์ฅ ํฐ ๊ฐ
int tMax = 0, chk[25][25] = { 0 };
if (d > -1) {
switch (d)
{
case 0: // ์
for (int j = 0; j < n; j++) {
int i = 0;
while (i < n - 1) {
if (a[i][j]) {
// ๋น๊ธธ ์ซ์์ ์์น ์ฐพ๊ธฐ
int idx = i + 1;
while (!a[idx][j] && idx < n) {
idx++;
}
if (!chk[idx][j] && a[i][j] == a[idx][j]) {
chk[i][j] = chk[idx][j] = 1;
a[i][j] *= 2;
a[idx][j] = 0;
tMax = a[i][j] > tMax ? a[i][j] : tMax;
}
}
i++;
}
// ๋น๊ณต๊ฐ ๋น๊ธฐ๊ธฐ 0์ด๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ์ซ์ ์ฐพ์์ ๊ฐ์ ธ์ค๊ธฐ
i = 0;
while (i < n - 1) {
if (!a[i][j]) {
// ๋น๊ธธ ์ซ์์ ์์น ์ฐพ๊ธฐ
int idx = i + 1;
while (!a[idx][j] && idx < n) {
idx++;
}
a[i][j] = a[idx][j];
a[idx][j] = 0;
}
i++;
}
}
break;
case 1: // ํ
for (int j = 0; j < n; j++) {
int i = n - 1;
while (i > 0) {
if (a[i][j]) {
// ๋น๊ธธ ์ซ์์ ์์น ์ฐพ๊ธฐ
int idx = i - 1;
while (!a[idx][j] && idx > 0) {
idx--;
}
if (!chk[idx][j] && a[i][j] == a[idx][j]) {
chk[i][j] = chk[idx][j] = 1;
a[i][j] *= 2;
a[idx][j] = 0;
tMax = a[i][j] > tMax ? a[i][j] : tMax;
}
}
i--;
}
// ๋น๊ณต๊ฐ ๋น๊ธฐ๊ธฐ 0์ด๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ์ซ์ ์ฐพ์์ ๊ฐ์ ธ์ค๊ธฐ
i = n - 1;
while (i > 0) {
if (!a[i][j]) {
// ๋น๊ธธ ์ซ์์ ์์น ์ฐพ๊ธฐ
int idx = i - 1;
while (!a[idx][j] && idx > 0) {
idx--;
}
a[i][j] = a[idx][j];
a[idx][j] = 0;
}
i--;
}
}
break;
case 2: // ์ข
for (int i = 0; i < n; i++) {
int j = 0;
while (j < n - 1) {
if (a[i][j]) {
int idx = j + 1;
while (!a[i][idx] && idx < n) {
idx++;
}
if (!chk[i][idx] && a[i][j] == a[i][idx]) {
chk[i][j] = chk[i][idx] = 1;
a[i][j] *= 2;
a[i][idx] = 0;
tMax = a[i][j] > tMax ? a[i][j] : tMax;
}
}
j++;
}
// ๋น๊ณต๊ฐ ๋น๊ธฐ๊ธฐ 0์ด๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ์ซ์ ์ฐพ์์ ๊ฐ์ ธ์ค๊ธฐ
j = 0;
while (j < n - 1) {
if (!a[i][j]) {
int idx = j + 1;
while (!a[i][idx] && idx < n - 1) {
idx++;
}
a[i][j] = a[i][idx];
a[i][idx] = 0;
}
j++;
}
}
break;
case 3: // ์ฐ
for (int i = 0; i < n; i++) {
int j = n - 1;
while (j > 0) {
if (a[i][j]) {
int idx = j - 1;
while (!a[i][idx] && idx > 0) {
idx--;
}
if (!chk[i][idx] && a[i][j] == a[i][idx]) {
chk[i][j] = chk[i][idx] = 1;
a[i][j] *= 2;
a[i][idx] = 0;
tMax = a[i][j] > tMax ? a[i][j] : tMax;
}
}
j--;
}
// ๋น๊ณต๊ฐ ๋น๊ธฐ๊ธฐ 0์ด๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ์ซ์ ์ฐพ์์ ๊ฐ์ ธ์ค๊ธฐ
j = n - 1;
while (j > 0) {
if (!a[i][j]) {
int idx = j - 1;
while (!a[i][idx] && idx > 0) {
idx--;
}
a[i][j] = a[i][idx];
a[i][idx] = 0;
}
j--;
}
}
break;
}
}
Max = tMax > Max ? tMax : Max;
for (int i = 0; i < 4; i++) {
go(a, i, cnt + 1);
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
Max = arr[i][j] > Max ? arr[i][j] : Max;
}
}
go(arr, -1, 0);
printf("%d", Max);
return 0;
}
|
cs |
๋ค๋ฅธ ๋ฐฉ๋ฒ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 0: down, 1: up, 2: left, 3: right
ok = false;
if (dir == 0) {
for (int i=n-2; i>=0; i--) {
for (int j=0; j<n; j++) {
if (d[i][j].first == 0) continue;
if (d[i+1][j].first == 0) {
d[i+1][j].first = d[i][j].first;
d[i+1][j].second = d[i][j].second;
d[i][j].first = 0;
ok = true;
} else if (d[i+1][j].first == d[i][j].first) {
if (d[i][j].second == false && d[i+1][j].second == false) {
d[i+1][j].first *= 2;
d[i+1][j].second = true;
d[i][j].first = 0;
ok = true;
}
}
}
}
}
|
cs |
์์ ์ฝ๋์ฒ๋ผ if ๋ฌธ์ผ๋ก ์ซ์๋ฅผ ํฉ์น๋ ๊ฒ๊ณผ ๋์์ ๊ณต๋ฐฑ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
๋ ์ข์ ๋ฐฉ๋ฒ
key point, ๋งคํ ํ์ ์ํค๊ณ ์ฐ์ฐ์ ํ๋ค๋ณด๋ฉด, ๋ค ๋ฐฉํฅ์ ๋ํ ์ฐ์ฐ์ ๋ชจ๋ ํ๊ฒ ๋๋ค.
- ์ฐ์ฐ์ up( ) ๋ฉ์๋๋ก ํ๋ค.
- ์๋ก์ด dfsํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ 90๋ ํ์ ํ๋ค. → r90( )
๋ฉ๋ชจ๋ฆฌ | ์๊ฐ |
1112 KB | 4 ms |
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
|
#include<stdio.h>
#include<memory.h>
int ans, N, i, j;
struct board {
int t[20][20];
void r90() {
int t2[20][20];
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
t2[i][j] = t[N - j - 1][i];
}
}
memcpy(t, t2, sizeof(t));
}
void up() {
int t2[20][20];
for (i = 0; i < N; i++) {
int c = -1, d = 0;
for (j = 0; j < N; j++) {
if (t[i][j] == 0);
else if (d && t[i][j] == t2[i][c]) t2[i][c] *= 2, d = 0;
else t2[i][++c] = t[i][j], d = 1;
}
for (c++; c < N; c++) t2[i][c] = 0;
}
memcpy(t, t2, sizeof(t));
}
void max_value() {
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (ans < t[i][j]) ans = t[i][j];
}
}
}
};
void dfs(board c, int l)
{
if (l >= 5) {
c.max_value();
return;
}
for (int i = 0; i < 4; i++) {
board d = c;
d.up();
dfs(d, l + 1);
c.r90();
}
}
int main()
{
board c;
scanf("%d", &N);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) scanf("%d", c.t[i] + j);
}
dfs(c, 0);
printf("%d\n", ans);
}
|
cs |
up( )
up๋ฉ์๋์์๋ t2๋ผ๋ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ธํ๊ณ , c ๋ผ๋ ์ธ์๋ก 0์ ์ ์ธํ ์ซ์๋ค์ ์ฐจ๋ก๋๋ก ์์ ์ ์๊ฒ ํ๋ค.
๋ณ์ d๋ ์ซ์๋ฅผ ํฉ์น ๋ ๋ฐ๋ก ์ ๋ค(c, j)์ ์กด์ฌํ๋ ์ซ์๋ผ๋ฆฌ ํฉ์น๋ ๋ฐฉ๋ฒ๋ฐ์ ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์ธ์ ํ ์์น์ ์๋ ์ซ์์ ํฉ์น๊ณ ๋๋ฉด d๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ (c+1, j+1)์ ๊ฐ์ด ๊ฐ๋๋ผ๋ d๊ฐ 0์ด๋ฏ๋ก ํฉ์น์ง ์๊ณ ๋์ด๊ฐ๋ค.
t1์ iํ์ ๋ชจ๋ ์ด์ ํ์ํ๋ค๋ฉด ๋๋จธ์ง ๋ถ๋ถ์๋ 0์ ์ฑ์ฐ๊ณ , t์ t2์ ๋ด์ฉ์ ๋ณต์ฌํ๋ค.
r90( )
๋ง์ฐฌ๊ฐ์ง๋ก t2๋ฐฐ์ด์ ๋ง๋ค์ด์ t๋ฅผ 90๋ ํ์ ํ ๊ฐ์ผ๋ก ์ฑ์ด๋ค.
์์ ์ฝ๋์ฒ๋ผ t2๋ฅผ 0๋ถํฐ n๊น์ง ์์ฐจ์ ์ผ๋ก ์ฑ์ฐ๊ณ ์ถ๋ค๋ฉด, ํด๋น ์์น์์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ์์น์ ์๋ t์ ๊ฐ์ ๋ฃ์ด์ค์ผํ๋ค. ๊ทธ๋์ผ t๋ฐฐ์ด์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๊ฐ์ด t2๊ฐ ๋๋ค.
t2๋ฅผ ๋ชจ๋ ๊ตฌํ๋ค๋ฉด t์ ๋ค์ ๋ณต์ฌํ๋ฉฐ ์ข ๋ฃํ๋ค.
max_value( )
๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
'๐ฅ PS(Problem Solving) ๐ฅ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #2632 ํผ์ํ๋งค (0) | 2021.02.05 |
---|---|
[BOJ] #1208 ๋ถ๋ถ์์ด์ ํฉ 2 (0) | 2021.02.04 |
[BOJ] #2143 ๋ ๋ฐฐ์ด์ ํฉ (0) | 2020.08.19 |
[BOJ] #15831 ์คํ์ ์กฐ์ฝ๋ (0) | 2020.08.19 |
[BOJ] #3366 ์์ด ์ค์ด๊ธฐ (0) | 2020.07.16 |
๋๊ธ