[구현]백준14891 톱니바퀴
업데이트:
백준14891
문제에서 설명하는 내용을 그래도 구현하면 되는 문제였다.
각 내용을 따로따로 구현했는데,
오른쪽으로 돌리는 함수 (시계방향으로 돌리기)
void right(int wheelNum){
int tmp;
tmp = wheel[wheelNum][7];
int arr[2];
arr[0] = wheel[wheelNum][0];
for(int i=1;i<=7;i++){
arr[i%2] = wheel[wheelNum][i];
wheel[wheelNum][i] = arr[(i+1)%2];
}
wheel[wheelNum][0] = tmp;
}
왼쪽으로 돌리는 함수 (반시계방향으로 돌리기)
void left(int wheelNum){
int tmp;
tmp = wheel[wheelNum][0];
int arr[2];
arr[1] = wheel[wheelNum][7];
for(int i = 6;i>=0;i--){
arr[i%2] = wheel[wheelNum][i];
wheel[wheelNum][i] = arr[(i+1)%2];
}
wheel[wheelNum][7] = tmp;
}
들어오는 바퀴 번호에 따라 번호에 해당하는 바퀴를 돌려주는 spin 함수
void spin(){
fill(spinned,spinned+5,false);
cin >> curWheel >> direction;
if(curWheel==1){
spin1(direction);
}
else if(curWheel==2){
spin2(direction);
}
else if(curWheel==3){
spin3(direction);
}
else if(curWheel==4){
spin4(direction);
}
}
각 톱니바퀴는 자신의 이웃한 톱니바퀴를 확인해야 하기 때문에 각 톱니바퀴를 따로 만들어주었다.
1번 톱니바퀴를 돌리는 함수는 2번 톱니바퀴를 확인하고, 돌릴지 여부를 결정해야 한다.
2번 톱니바퀴를 돌리는 함수는 1번과 3번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.
3번 톱니바퀴를 돌리는 함수는 2번과 4번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.
4번 톱니바퀴를 돌리는 함수는 3번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.
입력으로 들어온 년만큼 함수를 실행한 뒤 12시 방향을 확인해 점수화한다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int wheel[5][8];
bool spinned[5];
int curWheel;
int direction;
void right(int wheelNum){
int tmp;
tmp = wheel[wheelNum][7];
int arr[2];
arr[0] = wheel[wheelNum][0];
for(int i=1;i<=7;i++){
arr[i%2] = wheel[wheelNum][i];
wheel[wheelNum][i] = arr[(i+1)%2];
}
wheel[wheelNum][0] = tmp;
}
void left(int wheelNum){
int tmp;
tmp = wheel[wheelNum][0];
int arr[2];
arr[1] = wheel[wheelNum][7];
for(int i = 6;i>=0;i--){
arr[i%2] = wheel[wheelNum][i];
wheel[wheelNum][i] = arr[(i+1)%2];
}
wheel[wheelNum][7] = tmp;
}
void spin1(int mode);
void spin2(int mode);
void spin3(int mode);
void spin4(int mode);
void spin1(int mode){
spinned[1] = true;
if(wheel[1][2] != wheel[2][6] && !spinned[2]){
spin2(mode * -1);
}
if(mode==1){
right(1);
}
else{
left(1);
}
}
void spin2(int mode){
spinned[2] = true;
if(!spinned[1] && wheel[1][2] != wheel[2][6]) spin1(mode*-1);
if(!spinned[3] && wheel[2][2] != wheel[3][6]) spin3(mode * -1);
if(mode==1){
right(2);
}
else{
left(2);
}
}
void spin3(int mode){
spinned[3] = true;
if(!spinned[2] && wheel[2][2] != wheel[3][6]) spin2(mode*-1);
if(!spinned[4] && wheel[3][2] != wheel[4][6]) spin4(mode * -1);
if(mode==1){
right(3);
}
else{
left(3);
}
}
void spin4(int mode){
spinned[4] = true;
if(!spinned[3] && wheel[3][2] != wheel[4][6]) spin3(mode*-1);
if(mode==1){
right(4);
}
else{
left(4);
}
}
void spin(){
fill(spinned,spinned+5,false);
cin >> curWheel >> direction;
if(curWheel==1){
spin1(direction);
}
else if(curWheel==2){
spin2(direction);
}
else if(curWheel==3){
spin3(direction);
}
else if(curWheel==4){
spin4(direction);
}
}
int main(){
for(int i=1;i<=4;i++){
string s;
cin >> s;
for(int j=0;j<s.size();j++){
wheel[i][j] = s[j]-'0';
}
}
int k;
cin >> k;
int score = 0;
for(int i=0;i<k;i++){
spin();
}
int tmp = 1;
for(int j=1;j<=4;j++){
if(wheel[j][0]!=0) score += tmp;
tmp *= 2;
}
cout << score;
}
댓글남기기