아무코딩

[백준 14891] 톱니바퀴 본문

알고리즘/백준

[백준 14891] 톱니바퀴

동 코 2020. 4. 21. 18:52

문제풀이

1. 먼저 마주치는 톱니바퀴의 모양을 보고 방향다시 잡는다. 

현재 톱니 기준 왼쪽은 6 오른쪽은 2번째 톱니를 확인한다.

2.그리고 아래와같은 방식으로 회전시킨다. 반대방향은 반대로 하면된다.

 

소스코드

더보기
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
#include <stdio.h>
 
typedef struct Wheel{
    int tooth[8];
    int dir;
    int score;
}Wheel;
 
int n_turn;
Wheel wheel[4];
 
void changeAllDir(int num,int dir){
    //톱니바퀴 오른쪽방향설정
    for (int i = num;i<3; i++) {
        if (wheel[i].tooth[2== wheel[i + 1].tooth[6]) //같은극일때
            break;
        else {//다른극일때
            wheel[i + 1].dir = -1 * wheel[i].dir;
        }
    }
    //톱니바퀴 왼쪽방향설정
    for (int i = num; i>0; i--) {
        if (wheel[i].tooth[6== wheel[i - 1].tooth[2]) //같은극일때
            break;
        else {//다른극일때
            wheel[i - 1].dir = -1 * wheel[i].dir;
        }
    }
}
 
void turnWheel(int num,int dir){
    for(int i=0;i<4;i++){
        wheel[i].dir=0;
    }
    wheel[num].dir = dir;
    changeAllDir(num,dir);
    
    for (int i = 0; i < 4; i++) {
        if (wheel[i].dir == 1) {
            int temp = wheel[i].tooth[7];
            for (int j = 6; j >= 0; j--) {
                wheel[i].tooth[j + 1= wheel[i].tooth[j];
            }
            wheel[i].tooth[0= temp;
        }
        else if(wheel[i].dir==-1){
            int temp = wheel[i].tooth[0];
            for (int j = 0; j <=6; j++) {
                wheel[i].tooth[j] = wheel[i].tooth[j+1];
            }
            wheel[i].tooth[7= temp;
        }
        else {//dir==0
            continue;
        }
    }
    
}
 
int main() {
    int score=1;
    for(int i=0;i<4;i++){
        for(int j=0;j<8;j++){
            scanf("%1d",&wheel[i].tooth[j]);
        }
        wheel[i].score=score;
        score*=2;
    }
    scanf("%d",&n_turn);
    for(int i=0;i<n_turn;i++){
        int wheel_num;
        int wheel_dir;
        scanf("%d %d",&wheel_num,&wheel_dir);
        turnWheel(wheel_num-1, wheel_dir);
//        printf("\n톱니바퀴\n");
//         for(int i=0;i<4;i++){
//               for(int j=0;j<8;j++){
//                   printf("%d",wheel[i].tooth[j]);
//               }
//             printf("\n");
//           }
    }
    
    int sum=0;
    for(int i = 0; i < 4; i++) {
        if (wheel[i].tooth[0== 1)
            sum += wheel[i].score;
    }
    printf("%d\n",sum);
 
    
    return 0;
}
 
 
 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 11559] Puyo Puyo  (0) 2020.04.25
[백준 3190] 뱀  (0) 2020.04.22
[백준 1991] 트리 순회  (0) 2020.04.17
[백준 1806] 부분합  (0) 2020.04.17
[백준 15685] 드래곤 커브  (0) 2020.04.15
Comments