본문 바로가기
백준

[백준 14891] 톱니바퀴, C++

by 황인태(intaehwang) 2020. 2. 20.
반응형

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

소스 코드 추가+) // 쓸때없이 어렵게 코딩해서 쉽게 다시 코딩하였습니다.

// 아마도 이전 소스코드는 비트마스크 뽕에 차있었을 때 풀었던거 같습니다. (근데 지금도 비트 마스크 잘 못 쓰는건 함정)

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
#include <cstdio>
#include <cstring>
 
using namespace std;
 
int d[4][8];
int chk[4];
 
int main() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 8; j++) {
            scanf("%1d"&d[i][j]);
        }
    }
 
    int n;
    scanf("%d"&n);
    while (n--) {
        memset(chk, 0sizeof(chk));
        int x, y;
        scanf("%d %d"&x, &y);
        x -= 1;
 
        chk[x] = y;
        for (int i = x; i < 3; i++) {
            if (d[i][2!= d[i+1][6]) {
                chk[i+1= -chk[i];
            }
            else break;
        }
        for (int i = x; i > 0; i--) {
            if (d[i][6!= d[i-1][2]) {
                chk[i-1= -chk[i];
            }
            else break;
        }
 
        for (int i = 0; i < 4; i++) {
            if (chk[i] == 1) {
                int tmp = d[i][7];
                d[i][7= d[i][6];
                d[i][6= d[i][5];
                d[i][5= d[i][4];
                d[i][4= d[i][3];
                d[i][3= d[i][2];
                d[i][2= d[i][1];
                d[i][1= d[i][0];
                d[i][0= tmp;
            }
            else if (chk[i] == -1) {
                int tmp = d[i][0];
                d[i][0= d[i][1];
                d[i][1= d[i][2];
                d[i][2= d[i][3];
                d[i][3= d[i][4];
                d[i][4= d[i][5];
                d[i][5= d[i][6];
                d[i][6= d[i][7];
                d[i][7= tmp;
            }
        }
    }
    int ans = 0;
    if (d[0][0== 1) ans += 1;
    if (d[1][0== 1) ans += 2;
    if (d[2][0== 1) ans += 4;
    if (d[3][0== 1) ans += 8;
    printf("%d\n", ans);
}
cs

 본 문제는 삼성 SW 역량 테스트 기출 문제다. 톱니바퀴를 회전하여 마지막에 결과를 출력하는 문제인데 자세한 설명은 링크를 참고하길 바란다. 시뮬레이션 문제는 반드시 함수 또는 for문을 이용하여 풀어야 된다는 것을 절실히 느낀 문제다. 또 시뮬레이션 문제는 결과를 확인하면서 코딩하는것을 추천한다. 톱니바퀴의 회전을 비트 마스크를 이용하여 풀었다. 코드의 설명은 주석으로 표시하였다.

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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
 
using namespace std;
 
char c[] = {'0','1','2','3','4','5','6','7','8'};
string ans = "";
 
void cal(int n) {
    string tmp = "";
    while (n/2 > 0) {
        tmp = c[n%2+ tmp;
        n /= 2;
    }
    tmp = c[n%2+ tmp;
    ans += tmp;
}
 
int main() {  
    string s;
    vector<int> x(50);
    // 톱니바퀴를 이진수로 저장
    for (int i = 1; i <= 4; i++) {
        getline(cin ,s);
        for (int j = 0; j < s.size(); j++) {
            if (s[j] == '1') x[i] += (1 << (s.size()-1 - j));
        }
    }
    int x1 = x[1];
    int x2 = x[2];
    int x3 = x[3];
    int x4 = x[4];
 
    int n;
    cin >> n;
    while (n--) {
        int x, y;
        cin >> x >> y;
        bool chk[5]; // 회전 가능?
        int How[5]; // 시계방향? 반시계방향?
        memset(chk, falsesizeof(chk));
        memset(How, 0sizeof(How));
        if (x == 1) {
            chk[1= true;
            How[1= y;
            // 톱니2 회전 가능?
            if ( (x1&32)/32 == (x2&2)/2) chk[2= false;
            else {
                chk[2= true;
                How[2= -y;
                // 톱니3 회전 가능?
                if ( (x2&32)/32 == (x3&2)/2) chk[3= false;
                else {
                    chk[3= true;
                    How[3= y;
                    // 톱니4 회전 가능?
                    if ( (x3&32)/32 == (x4&2)/2) chk[4= false;
                    else {
                        chk[4= true;
                        How[4= -y;
                    }
                }
            }
        }
        else if (x == 2) {
            chk[2= true;
            How[2= y;
            // 톱니3 회전 가능?
            if ( (x2&32)/32 == (x3&2)/2) chk[3= false;
            else {
                chk[3= true;
                How[3= -y;
                // 톱니4 회전 가능?
                if ( (x3&32)/32 == (x4&2)/2 ) chk[4= false;
                else {
                    chk[4= true;
                    How[4= y;
                }
            }
            // 톱니1 회전 가능?
            if ( (x1&32)/32 == (x2&2)/2 ) chk[1= false;
            else {
                chk[1= true;
                How[1= -y;
            }
        }
        else if (x == 3) {
            chk[3= true;
            How[3= y;
            // 톱니4 회전 가능?
            if ( ((x3&32)/32 == (x4&2)/2) ) chk[4= false;
            else {
                chk[4= true;
                How[4= -y;
            }
            // 톱니2 회전 가능?
            if ( (x2&32)/32 == (x3&2)/2 ) chk[2= false;
            else {
                chk[2= true;
                How[2= -y;
                // 톱니1 회전 가능?
                if ( (x1&32)/32 == (x2&2)/2 ) chk[1= false;
                else {
                    chk[1= true;
                    How[1= y;
                }
            }
        }
        else if (x == 4) {
            chk[4= true;
            How[4= y;
            // 톱니3 회전 가능?
            if ( (x3&32)/32 == (x4&2)/2 ) chk[3= false;
            else {
                chk[3= true;
                How[3= -y;
                // 톱니2 회전 가능?
                if ( (x2&32)/32 == (x3&2)/2) chk[2= false;
                else {
                    chk[2= true;
                    How[2= y;
                    // 톱니1 회전 가능?
                    if ( (x1&32)/32 == (x2&2)/2 ) chk[1= false;
                    else {
                        chk[1= true;
                        How[1= -y;
                    }
                }
            }
        }
        for (int i = 1; i <= 4; i++) {
            // cout << i << "는 회전할 까? " << chk[i] << "\n";
            // cout << i << "는 어느 방향으로 회전할 까? " << How[i] << "\n";
            if (!chk[i]) continue;
            else {
                if (i == 1) {
                    if (How[i] == 1) {
                        if ((x1 & 1== 1) {
                            x1 /= 2;
                            x1 += 128;
                        }
                        else x1 /= 2;
                    }
                    else if (How[i] == -1){
                        if ((x1 & 128== 128) {
                            x1 *= 2;
                            x1 %= 256;
                            x1 += 1;
                        }
                        else x1 *= 2;
                    }
                }
                else if (i == 2) {
                    if (How[i] == 1) {
                        if ((x2 & 1== 1) {
                            x2 /= 2;
                            x2 += 128;
                        }
                        else x2 /= 2;
                    }
                    else if (How[i] == -1){
                        if ((x2 & 128== 128) {
                            x2 *= 2;
                            x2 %= 256;
                            x2 += 1;
                        }
                        else x2 *= 2;
                    }
                }
                else if (i == 3) {
                    if (How[i] == 1) {
                        if ((x3 & 1== 1) {
                            x3 /= 2;
                            x3 += 128;
                        }
                        else x3 /= 2;
                    }
                    else if (How[i] == -1){
                        if ((x3 & 128== 128) {
                            x3 *= 2;
                            x3 %= 256;
                            x3 += 1;
                        }
                        else x3 *= 2;
                    }
                }
                else if (i == 4) {
                    if (How[i] == 1) {
                        if ((x4 & 1== 1) {
                            x4 /= 2;
                            x4 += 128;
                        }
                        else x4 /= 2;
                    }
                    else if (How[i] == -1){
                        if ((x4 & 128== 128) {
                            x4 *= 2;
                            x4 %= 256;
                            x4 += 1;
                        }
                        else x4 *= 2;
                    }
                }
            }
        }
        // 톱니바퀴의 회전 결과 출력
        // cout << "\n";
        // ans = "";
        // cal(x1);
        // if (ans.size() != 8) ans = '0'+ans;
        // cout << ans << "\n";
        // ans = "";
        // cal(x2);
        // if (ans.size() != 8) ans = '0'+ans;
        // cout << ans << "\n";
        // ans = "";
        // cal(x3);
        // if (ans.size() != 8) ans = '0'+ans;
        // cout << ans << "\n";
        // ans = "";
        // cal(x4);
        // if (ans.size() != 8) ans = '0'+ans;
        // cout << ans << "\n";
        // cout << "\n";
    }
    int ans = 0;
 
    if ( (x1 & 128== 128 ) ans += 1;
    if ( (x2 & 128== 128 ) ans += 2;
    if ( (x3 & 128== 128 ) ans += 4;
    if ( (x4 & 128== 128 ) ans += 8;
    cout << ans << "\n";
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 11404] 플로이드, C++  (0) 2020.02.21
[백준 1916] 최소비용 구하기, C++  (0) 2020.02.21
[백준 17144] 미세먼지 안녕!, C++  (0) 2020.02.19
[백준 1922] 네트워크 연결, C++  (0) 2020.02.17
[백준 5557] 1학년, C++  (0) 2020.02.17
Buy me a coffeeBuy me a coffee

댓글