Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ14891_톱니바퀴 본문

APS

BOJ14891_톱니바퀴

ChoiSH313 2019. 6. 4. 21:33

https://www.acmicpc.net/problem/14891


문제요약

1. 톱니의 상태가 12시 방향부터 주어진다. (0은 N극 , 1은 S극)

2. 몇번 회전할지 주어지고(K) , 회전시킬 톱니 번호와 방향(1은 시계방향 , -1은 반시계방향)이 주어진다.

3. 번호에 해당하는 톱니를 A라고 하고 옆에 있는 톱니를 B라고 했을 때 돌리기 전에 옆에 있는 톱니와 맞닿은

곳의 극이 다르면 A톱니의 방향과 반대로 B톱니가 회전한다.

4. K번 회전이 끝난 후 1번 톱니의 12시방향이 S극이면 1점

2번은 2점 , 3번은 4점 , 4번은 8점으로 해서 총 합을 출력한다.


문제 issue

1. 맞닿은 곳을 어떤식으로 표현?? - 12시 방향을 0번 인덱스로 뒀을 때 톱니끼리 2번 혹은 6번이 맞닿는 곳이다.

2. 회전하지 않는 톱니라면 그 옆은 볼 필요가 없다.


해결흐름

1. 회전시킬 톱니번호로 가장크게 분류한다.

2. 회전시킬 톱니번호를 먼저 회전 해주기 전에 옆에 톱니와 맞닿은 곳의 극이 다른지를 먼저 검사한다.

3. 계속해서 옆에 톱니랑 맞닿은 곳의 극이 다른지를 먼저 검사하고 끝에 톱니부터 l_rotate 또는 r_rotate 해준다.

4. rotate는 q를 이용해서 해준다.

5. K번의 회전이 끝난 후 각 톱니의 12시 방향의 극을 검사하고 S극이면 sum에 더해준다.


소스코드

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
200
201
202
203
204
205
206
207
208
209
210
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
 
    private static int[][] wheel;
    private static int sum;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        wheel = new int[5][8];
        for (int i = 0; i < 4; i++) {
            String s = br.readLine().trim();
            for (int j = 0; j < s.length(); j++) {
                wheel[i+1][j] = s.charAt(j) - '0';
            }
        }
        int K = Integer.parseInt(br.readLine().trim());
        for (int i = 0; i < K; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
            int wheel_num = Integer.parseInt(st.nextToken());
            int dir = Integer.parseInt(st.nextToken());
            // wheel_num에 따라서 양옆에 톱니가 있는지 보고 극이 다른지 확인
            if(wheel_num == 1) {
                // wheel_num에 해당하는 톱니를 먼저 돌려주기 전에 옆에 있는 톱니와 맞닿은 곳이 서로 다른 극인지 먼저 검사 해줘야 한다
                if(wheel[1][2!= wheel[2][6]) {
                    if(wheel[2][2!= wheel[3][6]) {
                        if(wheel[3][2!= wheel[4][6]) {
                            if(dir == 1) {
                                r_rotate(4);
                            }
                            else if(dir == -1) {
                                l_rotate(4);
                            }
                        }
                        if(dir == 1) {
                            l_rotate(3);
                        }
                        else if(dir == -1) {
                            r_rotate(3);
                        }
                    }
                    if(dir == 1) {
                        r_rotate(2);
                    }
                    else if(dir == -1) {
                        l_rotate(2);
                    }
                }
                if(dir == 1) {
                    l_rotate(1);
                }
                else if(dir == -1) {
                    r_rotate(1);
                }
            }
            else if(wheel_num == 2) {
                if(wheel[2][6!= wheel[1][2]) {
                    if(dir == 1) {
                        r_rotate(1);
                    }
                    else if(dir == -1) {
                        l_rotate(1);
                    }
                }
                if(wheel[2][2!= wheel[3][6]) {
                    if(wheel[3][2!= wheel[4][6]) {
                        if(dir == 1) {
                            l_rotate(4);
                        }
                        else if(dir == -1) {
                            r_rotate(4);
                        }
                    }
                    if(dir == 1) {
                        r_rotate(3);
                    }
                    else if(dir == -1) {
                        l_rotate(3);
                    }
                }
                if(dir == 1) {
                    l_rotate(2);
                }
                else if(dir == -1) {
                    r_rotate(2);
                }
            }
            else if(wheel_num == 3) {
                if(wheel[3][6!= wheel[2][2]) {
                    if(wheel[2][6!= wheel[1][2]) {
                        if(dir == 1) {
                            l_rotate(1);
                        }
                        else if(dir == -1) {
                            r_rotate(1);
                        }
                    }
                    if(dir == 1) {
                        r_rotate(2);
                    }
                    else if(dir == -1) {
                        l_rotate(2);
                    }
                }
                if(wheel[3][2!= wheel[4][6]) {
                    if(dir == 1) {
                        r_rotate(4);
                    }
                    else if(dir == -1) {
                        l_rotate(4);
                    }
                }
                if(dir == 1) {
                    // 회전할 톱니 번호만 넘겨주자
                    l_rotate(3);
                }
                else if(dir == -1) {
                    r_rotate(3);
                }
            }
            else if(wheel_num == 4) {
                if(wheel[4][6!= wheel[3][2]) {
                    if(wheel[3][6!= wheel[2][2]) {
                        if(wheel[2][6!= wheel[1][2]) {
                            if(dir == 1) {
                                r_rotate(1);
                            }
                            else if(dir == -1) {
                                l_rotate(1);
                            }
                        }
                        if(dir == 1) {
                            l_rotate(2);
                        }
                        else if(dir == -1) {
                            r_rotate(2);
                        }
                    }
                    if(dir == 1) {
                        r_rotate(3);
                    }
                    else if(dir == -1) {
                        l_rotate(3);
                    }
                }
                if(dir == 1) {
                    l_rotate(4);
                }
                else if(dir == -1) {
                    r_rotate(4);
                }
            }
//            for (int k = 0; k < wheel.length; k++) {
//                System.out.println(Arrays.toString(wheel[k]));
//            }
            sum = 0;
            for (int j = 1; j <= 4; j++) {
                if(j == 1) {
                    if(wheel[j][0== 1) {
                        sum += 1;
                    }
                }
                else if(j == 2) {
                    if(wheel[j][0== 1) {
                        sum += 2;
                    }
                }
                else if(j == 3) {
                    if(wheel[j][0== 1) {
                        sum += 4;
                    }
                }
                else if(j == 4) {
                    if(wheel[j][0== 1) {
                        sum += 8;
                    }
                }
            }
        }
        System.out.println(sum);
    } // end of main
 
    private static void l_rotate(int wheel_num) {
        Queue<Integer> q = new LinkedList<Integer>();
        for (int i = 0; i < 8; i++) {
            q.add(wheel[wheel_num][i]);
        }
        for (int i = 1; i < 8; i++) {
            wheel[wheel_num][i] = q.poll();
        }
        wheel[wheel_num][0= q.poll();
    }
 
    private static void r_rotate(int wheel_num) {
        Queue<Integer> q = new LinkedList<>();
        for (int i = 7; i >= 0; i--) {
            q.add(wheel[wheel_num][i]);
        }
        for (int i = 6; i >= 0; i--) {
            wheel[wheel_num][i] = q.poll();
        }
        wheel[wheel_num][7= q.poll();
    }
// end of class
cs


'APS' 카테고리의 다른 글

BOJ2146_다리만들기  (0) 2019.06.09
BOJ17281_야구  (0) 2019.06.09
BOJ14499_주사위굴리기  (0) 2019.06.03
BOJ2980_도로와신호등  (0) 2019.05.29
BOJ17143_낚시왕  (2) 2019.05.09