맛있는감귤

BOJ : 12100 2048(Easy) 본문

알고리즘/백준 알고리즘

BOJ : 12100 2048(Easy)

맛있는감귤 2017. 4. 28. 01:17

문제 : https://www.acmicpc.net/problem/3190

2016년 삼성 하반기 공채 SW 역량테스트 오전 문제

째로탈출과 같이 나온 오전 문제. 

한 때 인기몰이를 했던 2048 게임의 축소판이다.

이 문제는 최대 이동횟수가 5이기에 DFS나 BFS 두 가지 방법으로 모두 해결가능하다.

하지만 한 쪽으로 기울일 때 숫자가 합쳐지는 과정을 어떻게 구현하느냐가 문제!

상하좌우를 각각 짜서 코드 가독성이 매우 안좋음

나는 한 쪽으로 치우쳐지면서 숫자가 합쳐지는 것을 vector로 짰다. 

0(빈공간)을 제외한 숫자를 벡터에 받고 v[k]와 v[k+1]을 비교한 후 같으면 v[k]*2, v[k+1]=0으로 만들어주고 다시 숫자판에 초기화해주었음.

포스팅하기 민망한 코드이지만 필요할 수도 있는 사람을 위해서 올림ㅠㅠ


2016년 삼성 하반기 공채 SW 역량테스트 문제

12100 2048(Easy) / 해설 오전

3190 뱀  오후


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
188
189
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
 
int N,ans=0,cnt=1;
vector<vector<int>> m;
queue<vector<vector<int>>> q;
 
 
void print(vector<vector<int>> map){
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int main(){
    scanf("%d",&N);
    m.resize(N*N);
    for(int i=0;i<N;i++){
        for(int j=0,n;j<N;j++){
            scanf("%d",&n);
            m[i].push_back(n);
        }
    }
    ans=m[0][0];
    q.push(m);
    while(!q.empty()){
        int sz = q.size();
        while(sz--){
            
            vector<vector<int>> t = q.front();
            q.pop();
            
            //right
            vector<vector<int>> tt;
            tt.resize(N*N);
            for(int r=0;r<N;r++){
                
                for(int rr=0;rr<N;rr++)
                    for(int cc=0;cc<N;cc++)
                        tt[rr].push_back(0);
                
                vector<int> v;
                v.resize(N);
                for(int c=N-1;c>=0;c--)
                    if(t[r][c] !=0) v.push_back(t[r][c]);
                
                for(int k=0;k<v.size();k++){
                    if(k==v.size()-1) {
                        if(ans < v[k]) ans=v[k];
                        continue;
                    }
                    if(v[k]==v[k+1]) {
                        v[k] += v[k+1];
                        if(ans < v[k]) ans = v[k];
                        v[k+1= 0;
                    }
                }
                
                for(int k=0,l=N-1;k<v.size();k++){
                    if(v[k] !=0){
                        tt[r][l--= v[k];
                    }
                }
            }
            q.push(tt);
            
            
            //left
            tt.clear();
            tt.resize(N*N);
            for(int r=0;r<N;r++){
                
                for(int rr=0;rr<N;rr++)
                    for(int cc=0;cc<N;cc++)
                        tt[rr].push_back(0);
                
                
                vector<int> v;
                v.resize(N);
                for(int c=0;c<N;c++)
                    if(t[r][c] !=0) v.push_back(t[r][c]);
                
                for(int k=0;k<v.size();k++){
                    if(k==v.size()-1) {
                        if(ans < v[k]) ans=v[k];
                        continue;
                    }
                    if(v[k]==v[k+1]) {
                        v[k] += v[k+1];
                        if(ans < v[k]) ans = v[k];
                        v[k+1= 0;
                    }
                }
                
                for(int k=0,l=0;k<v.size();k++){
                    if(v[k] !=0){
                        tt[r][l++= v[k];
                    }
                }
            }
            
            q.push(tt);
            
            //up
            tt.clear();
            tt.resize(N*N);
            for(int c=0;c<N;c++){
                
                for(int rr=0;rr<N;rr++)
                    for(int cc=0;cc<N;cc++)
                        tt[rr].push_back(0);
                
                
                vector<int> v;
                v.resize(N);
                for(int r=0;r<N;r++)
                    if(t[r][c] !=0) v.push_back(t[r][c]);
                
                
                
                for(int k=0;k<v.size();k++){
                    if(k==v.size()-1) {
                        if(ans < v[k]) ans=v[k];
                        continue;
                    }
                    if(v[k]==v[k+1]) {
                        v[k] += v[k+1];
                        if(ans < v[k]) ans = v[k];
                        v[k+1= 0;
                    }
                }
                
                for(int k=0,l=0;k<v.size();k++){
                    if(v[k] !=0){
                        tt[l++][c] = v[k];
                    }
                }
                
                
                
            }
            q.push(tt);
            
            //down
            tt.clear();
            tt.resize(N*N);
            for(int c=0;c<N;c++){
                
                for(int rr=0;rr<N;rr++)
                    for(int cc=0;cc<N;cc++)
                        tt[rr].push_back(0);
                
                vector<int> v;
                v.resize(N);
                for(int r=N-1;r>=0;r--)
                    if(t[r][c] !=0) v.push_back(t[r][c]);
                
                for(int k=0;k<v.size();k++){
                    if(k==v.size()-1) {
                        if(ans < v[k]) ans=v[k];
                        continue;
                    }
                    if(v[k]==v[k+1]) {
                        v[k] += v[k+1];
                        if(ans < v[k]) ans = v[k];
                        v[k+1= 0;
                    }
                }
                
                for(int k=0,l=N-1;k<v.size();k++){
                    if(v[k] !=0){
                        tt[l--][c] = v[k];
                    }
                }
                
            }
            q.push(tt);
            
        }
        cnt++;
        if(cnt>5break;
    }
    printf("%d\n",ans);
}
cs


'알고리즘 > 백준 알고리즘' 카테고리의 다른 글

BOJ : 5567 결혼식  (0) 2017.04.28
BOJ : 13458 시험감독  (0) 2017.04.28
BOJ : 13459 째로탈출  (2) 2017.04.28
BOJ : 1261 알고스팟  (2) 2017.04.28
BOJ : 1074 Z  (2) 2017.04.28