Algorithm

[SWEA] 6019. 추억의 2048게임

프로그래민 2020. 4. 30. 00:06
반응형

이 문제는 복잡해보이지만 문제에 주어진 조건 그대로 하면되는 단순구현 문제이다.

문제에서 가장어려웠던 요소는 4가지 방향을 생각해주는 것과 0을 한쪽으로 옮기는 과정이었다. 0을 한쪽으로 옮기는 메소드를 moveZero~(row or col) 이런식으로 구성하였는데, 다양한 문제에서 빈번하게 사용되는 코드이므로 숙지하고 있으면 많은 도움이 될 것 같다.

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
package swea;
 
 
public class Solution_d4_6109_추억의2048게임 {
    
    static int[][] map;
    static int N;
    
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st  = null;
        
        int T=Integer.parseInt(br.readLine());
        for(int tc=1;tc<=T;tc++) {
            st=new StringTokenizer(br.readLine());
            N=Integer.parseInt(st.nextToken());
            char c=st.nextToken().charAt(0);
            
            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());
                }
            }
            
            if(c=='u') {
                up();
            }else if(c=='r') {
                right();
            }else if(c=='d') {
                down();
            }else if(c=='l') {
                left();
            }
            
            System.out.println("#"+tc);
            for(int i=0;i<N;i++) {
                for(int j=0;j<N;j++) {
                    System.out.print(map[i][j]+" ");
                }
                System.out.println();
            }
            
        }
    }
    
    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] 1339. 단어수학  (0) 2020.04.30
[BOJ] 12100. 2048(Easy)  (0) 2020.04.30
[SWEA] 4050. 재관이의 대량 할인  (0) 2020.04.30
[SWEA] 5658. 보물상자 비밀번호  (0) 2020.04.29
[Programmers] 불량 사용자  (0) 2020.04.28