문제 링크
구현문제이다. 간단하다면 간단할 수 있는 문제인데 오류찾는거까지 순수하게 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 문으로 최적화시켜 코드를 줄일 필요가 있다는 생각이 들었다.
'Algorithm > 문제 풀이 (Problem Solving)' 카테고리의 다른 글
[C++,구현] 백준 14890번 경사로 문제풀이 (0) | 2019.04.06 |
---|---|
[C++,완탐] 백준 14500번 테트로미노 문제풀이 (0) | 2019.03.30 |
[C++,구현] 백준 14499번 주사위 굴리기 문제풀이 (0) | 2019.03.14 |
[C++,DP] 백준 2294번 동전2 문제풀이 (0) | 2019.03.08 |
[C++,DP] 백준 9465번 스티커 문제풀이 (0) | 2019.03.04 |
댓글