반응형
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
풀이 )
각 k번에 대해서 모든 톱니의 좌우 자석을 보고 옆 톱니의 회전에 따른 다른 톱니 회전 여부를 파악한다. (status)
지정된 번호의 톱니를 확인한 후 왼쪽으로 방향으로 회전하는 톱니가 있는지 확인하고, 오른쪽 방향도 확인한다.
#include <iostream>
using namespace std;
int pow(int x, int n){
if(n == 0){
return 1;
}
else{
return x*pow(x, n-1);
}
}
int right(int gear){
return gear/pow(10, 5)%10;
}
int left(int gear){
return gear/10%10;
}
int rotation(int gear, int dir){
if(dir == 1){
gear = (gear/10)+(gear%10*pow(10, 7));
}
else{
gear = (gear%pow(10, 7)*10)+gear/pow(10, 7);
}
return gear;
}
int main(void){
int gear[4];
cin >> gear[0] >> gear[1] >> gear[2] >> gear[3];
int k;
cin >> k;
while(k--){
int gearNum, dir;
cin >> gearNum >> dir;
gearNum--;
int status[3] = {0, };
for(int i = 0; i < 3; ++i)
if(right(gear[i]) != left(gear[i+1]))
status[i] = 1;
gear[gearNum] = rotation(gear[gearNum], dir);
int l = gearNum, r = gearNum;
dir *= -1;
int ldir = dir, rdir = dir;
while(--l >= 0 && status[l] == 1){
gear[l] = rotation(gear[l], ldir);
ldir *= -1;
}
while(++r < 4 && status[r-1] == 1){
gear[r] = rotation(gear[r], rdir);
rdir *= -1;
}
}
int res = 0;
for(int i = 0; i < 4; ++i)
res += gear[i]/pow(10, 7)*pow(2, i);
cout << res << endl;
return 0;
}
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 - 1004 : 어린 왕자 (0) | 2020.11.29 |
---|---|
[C++] 백준 - 1002 : 터렛 (0) | 2020.11.29 |
[C++] 백준 - 14888 : 연산자 끼워넣기 (0) | 2020.11.25 |
[C++] 백준 - 2583 : 영역 구하기 (0) | 2020.11.25 |
[C++] 백준 - 4796 : 캠핑 (0) | 2020.11.23 |