본문 바로가기
Algorithm/문제 풀이 (Problem Solving)

[C++,구현] 백준 14891번 톱니바퀴 문제풀이

by matters_ 2019. 3. 27.

문제 링크

백준 14891번 톱니바퀴

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

구현문제이다. 간단하다면 간단할 수 있는 문제인데 오류찾는거까지 순수하게 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
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
#include <cstdio>
int topni[4][9],f0=0,f1=0,f2=0;
 
void topcopy(int (*a)[9],int (*b)[9]){
    for(int i=0;i<4;i++)
        for(int j=0;j<8;j++)
            a[i][j]=b[i][j];
        
}
 
void turn_c(int a){
    int tmp[4][9];
        topcopy(tmp,topni);
        for(int j=0;j<8;j++)topni[a][(j+1)%8]=tmp[a][j];
}
 
void turn_cw(int a){
    int tmp[4][9];
        topcopy(tmp,topni);
        for(int j=0;j<8;j++)topni[a][j]=tmp[a][(j+1)%8];
}
 
void move(int a,int b){
    
    switch(a){
        
        case 1:
            if(b==1){
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_c(0);
                if(f0)turn_cw(1);
                if(f0*f1)turn_c(2);
                if(f0*f1*f2)turn_cw(3);
            }
            else{
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_cw(0);
                if(f0)turn_c(1);
                if(f0*f1)turn_cw(2);
                if(f0*f1*f2)turn_c(3);
            }
            break;
        case 2:
            if(b==1){
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_c(1);
                if(f0)turn_cw(0);
                if(f1)turn_cw(2);
                if(f1*f2)turn_c(3);
            }
            else{
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_cw(1);
                if(f0)turn_c(0);
                if(f1)turn_c(2);
                if(f1*f2)turn_cw(3);
            }
            break;
        case 3:
            if(b==1){
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_c(2);
                if(f1)turn_cw(1);
                if(f2)turn_cw(3);
                if(f0*f1)turn_c(0);
            }
            else{
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_cw(2);
                if(f1)turn_c(1);
                if(f2)turn_c(3);
                if(f0*f1)turn_cw(0);//
            }
            break;
        case 4:
            if(b==1){
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_c(3);
                if(f2)turn_cw(2);
                if(f2*f1)turn_c(1);
                if(f2*f1*f0)turn_cw(0);
            }
            else{
                f0=0,f1=0,f2=0;
                if(topni[0][2]!=topni[1][6])f0=1;
                if(topni[1][2]!=topni[2][6])f1=1;
                if(topni[2][2]!=topni[3][6])f2=1;
                turn_cw(3);
                if(f2)turn_c(2);
                if(f2*f1)turn_cw(1);
                if(f2*f1*f0)turn_c(0);
            }
            break;
        }    
}
 
main(){
    for(int i=0;i<4;i++)
        for(int j=0;j<8;j++)
            scanf("%1d",&topni[i][j]);
 
    int k,a,b;
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d %d",&a,&b);
        move(a,b);
    }
    
    int ans=0,two=1;
    
    for(int i=0;i<4;i++)
    {
        ans+=topni[i][0]*two;
        two*=2;
    }
    printf("%d\n",ans);
    /*
    for(int i=0;i<4;i++){
        for(int j=0;j<8;j++){
            printf("%d",topni[i][j]);
        }
        printf("\n"); 
    }
    */
}
cs

 

입력을 받은후에 톱니가 움직일 수 있도록 하는 move함수, 톱니가 시계방향으로 움직이도록 하는 turn_c, 톱니가 시계반대방향으로 움직이도록 하는 turn_cw 함수를 만들고 입력을 받고 각각 어떤톱니를 어떤방향으로 움직이는지에 따라 switch case 문으로 움직인 방향을 각각 조사해서 돌아가도록 만들었다.

다른 사람의 코드를 보니 톱니가 돌아가야할 방향과 그에 따른 구현부분을 for 문으로 최적화시켜 코드를 줄일 필요가 있다는 생각이 들었다. 

 

 

댓글