본문 바로가기
백준

[백준 15662] 톱니바퀴 (2), C++

by 황인태(intaehwang) 2020. 4. 12.
반응형

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

 

15662번: 톱니바퀴 (2)

총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, ..., 가장 오른쪽 톱니바퀴는 T번이다. 아래 그림은 T가 4인 경우이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다

www.acmicpc.net

본 문제는 톱니바퀴 문제와 마지막 12시에 톱니 개수를 구하는 부분만 다른 문제다. 톱니바퀴 문제를 풀 때를 생각해보면 참 어렵게 풀었고 구현하는데 오래 걸렸는데 이번 톱니바퀴 (2) 문제는 쉽고 빠르게 구현되었다. 괜히 그때 비트 연산자를 사용해서 까불었던 거 같다. chk 배열로 회전 방향과 여부를 파악하였고 하나씩 배열을 옮기면서 문제를 해결하였다.

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

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

[백준 16933] 벽 부수고 이동하기 3, C++  (0) 2020.04.22
[백준 15683] 감시, C++  (0) 2020.04.16
[백준 1938] 통나무 옮기기, C++  (0) 2020.03.30
[백준 1005] ACM Craft, C++  (0) 2020.03.22
[백준 16926] 배열 돌리기 1, C++  (0) 2020.03.12
Buy me a coffeeBuy me a coffee

댓글