Algorithm

[BOJ] 12100. 2048(Easy)

프로그래민 2020. 4. 30. 21:32
반응형

단순구현과 백트래킹이 합쳐진 문제이다.

이문제는 2048을 구하는 단순구현과 4가지 방향으로 5번을 가봐야하는 과정이합쳐진 문제였다. 2차원 배열을 이용하여 재귀를 도는 백트래킹은 처음 구현해봐서 어떻게 해야하는지 고민을 많이했다. dfs()란 함수에서 이차원 배열을 저장할 temp[][] 를 이용하여 해결하였다. 즉 재귀함수호출전 temp에 map을 다 저장하고 재귀함수 호출뒤 map에 temp를 다시 복원시키는 방법을 사용하였다. 간단한 방법이지만 생각하는 부분에 있어서 많은 시간을 사용하였다.

구현뿐만 아니라 전반적으로 다시 봐야할 필요가 있는 문제인 것 같다.

 
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
190
191
192
193
194
195
196
197
198
199
package boj;
 
 
public class Main_bj_12100_2048Easy {
    
    static int[][] map;
    static int N;
    static int max;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        
        N=Integer.parseInt(br.readLine());
        map=new int[N][N];
        
        for(int i=0;i<N;i++) {
            st=new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++) {
                map[i][j]=Integer.parseInt(st.nextToken());
            }
        }
        max=0;
        dfs(0);
        System.out.println(max);
    }
    
    
    static void dfs(int depth) {
        findMax();
    
        if(depth==5) {
            return;
        }
        
        
        int[][] temp=new int[N][N];
        for(int i=0;i<N;i++) {
            for(int j=0;j<N;j++) {
                temp[i][j]=map[i][j];
            }
        }
        
        for(int dir=0;dir<4;dir++) {
            if(dir==0) {up();dfs(depth+1);}
            else if(dir==1) { right(); dfs(depth+1);}
            else if(dir==2) {down(); dfs(depth+1);}
            else if(dir==3) {left(); dfs(depth+1);}
            
            for(int i=0;i<N;i++) {
                for(int j=0;j<N;j++) {
                    map[i][j]=temp[i][j];
                }
            }
        }
        
        
    }
 
    static void findMax() {
        for(int i=0;i<N;i++) {
            for(int j=0;j<N;j++) {
                max=map[i][j]>max?map[i][j]:max;
            }
        }
    }
    
    static void up() {
        for(int col=0;col<N;col++)
            moveZeroDown(col);
        
        for(int col=0;col<N;col++) {
            for(int row=0;row<=N-2;row++) {
                if(map[row][col]!=0 && checkPow2(map[row][col]+map[row+1][col])) {
                    map[row][col]=map[row][col]+map[row+1][col];
                    map[row+1][col]=0;
                    moveZeroDown(col);
                }
            }
        }
    }
    static void right() {
        for(int row=0;row<N;row++)
            moveZeroLeft(row);
        
        for(int row=0;row<N;row++) {
            for(int col=N-1;col>=1;col--) {
                if(map[row][col]!=0 && checkPow2(map[row][col]+map[row][col-1])) {
                    map[row][col]=map[row][col]+map[row][col-1];
                    map[row][col-1]=0;
                    moveZeroLeft(row);
                }
            }
        }
    }
    static void down() {
        for(int col=0;col<N;col++)
            moveZeroUp(col);
        
        for(int col=0;col<N;col++) {
            for(int row=N-1;row>=1;row--) {
                if(map[row][col]!=0 && checkPow2(map[row][col]+map[row-1][col])) {
                    map[row][col]=map[row][col]+map[row-1][col];
                    map[row-1][col]=0;
                    moveZeroUp(col);
                }
            }
        }
    }
    static void left() {
        for(int row=0;row<N;row++)
            moveZeroRight(row);
        
        for(int row=0;row<N;row++) {
            for(int col=0;col<=N-2;col++) {
                if(map[row][col]!=0 && checkPow2(map[row][col]+map[row][col+1])) {
                    map[row][col]=map[row][col]+map[row][col+1];
                    map[row][col+1]=0;
                    moveZeroRight(row);
                }
            }
        }
    }
    
    static void moveZeroLeft(int row) {
        for(int i=N-1;i>=1;i--) {
            if(map[row][i]==0) {
                for(int j=i-1;j>=0;j--) {
                    if(map[row][j]!=0) {
                        map[row][i]=map[row][j];
                        map[row][j]=0;
                        break;
                    }
                }
            }
        }
    }
    static void moveZeroRight(int row) {
        for(int i=0;i<=N-2;i++) {
            if(map[row][i]==0) {
                for(int j=i+1;j<=N-1;j++) {
                    if(map[row][j]!=0) {
                        map[row][i]=map[row][j];
                        map[row][j]=0;
                        break;
                    }
                }
            }
        }
    }
    
    static void moveZeroDown(int col) {
        for(int i=0;i<=N-2;i++) {
            if(map[i][col]==0) {
                for(int j=i+1;j<=N-1;j++) {
                    if(map[j][col]!=0) {
                        map[i][col]=map[j][col];
                        map[j][col]=0;
                        break;
                    }
                }
            }
        }
        
    }
    
    static void moveZeroUp(int col) {
        for(int i=N-1;i>=1;i--) {
            if(map[i][col]==0) {
                for(int j=i-1;j>=0;j--) {
                    if(map[j][col]!=0) {
                        map[i][col]=map[j][col];
                        map[j][col]=0;
                        break;
                    }
                }
            }
        }
    }
    
    static boolean checkPow2(int num) {
        int mod;
        while(num!=1) {
            mod=num%2;
            if(mod==0) {
                num=num/2;
            }
            else
                return false;
        }
        
        
        return true;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
                                              
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 17281.⚾  (0) 2020.05.01
[BOJ] 1339. 단어수학  (0) 2020.04.30
[SWEA] 6019. 추억의 2048게임  (0) 2020.04.30
[SWEA] 4050. 재관이의 대량 할인  (0) 2020.04.30
[SWEA] 5658. 보물상자 비밀번호  (0) 2020.04.29