๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #12100 2048

by dar0m! 2020. 9. 18.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
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, -10);
 
    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 == 0continue;
            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( )

๊ฐ€์žฅ ํฐ ๋ธ”๋ก์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋Œ“๊ธ€