14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제 해결 전략
톱니바퀴를 배열로 구해서, 시계 방향 또는 반시계 방향으로 swap한다.
나머지는 문제에서 제시한 대로 진행
소스
#include <iostream>
#include <cstdio>
using namespace std;
int tob[5][9];
int k;
void spin(int num, int dir){
if(dir == 1){ // 시계 방향
for(int i = 8; i >= 2; i--){
swap(tob[num][i], tob[num][i - 1]);
}
}else if(dir == -1){ // 반시계 방향
for(int i = 1; i <= 7; i++){
swap(tob[num][i], tob[num][i + 1]);
}
}
}
void solution(int num, int dir){
if(num == 1){
if(tob[1][3] != tob[2][7]){
if(tob[2][3] != tob[3][7]){
if(tob[3][3] != tob[4][7]){
spin(4, dir*(-1));
}
spin(3, dir);
}
spin(2, dir*(-1));
}
spin(num, dir);
}else if(num == 2){
if(tob[2][3] != tob[3][7]){
if(tob[3][3] != tob[4][7]){
spin(4, dir);
}
spin(3, dir*(-1));
}
if(tob[2][7] != tob[1][3]){
spin(1, dir*(-1));
}
spin(num, dir);
}else if(num == 3){
if(tob[3][7] != tob[2][3]){
if(tob[2][7] != tob[1][3]){
spin(1, dir);
}
spin(2, dir*(-1));
}
if(tob[3][3] != tob[4][7]){
spin(4, dir*(-1));
}
spin(num, dir);
}else if(num == 4){
if(tob[4][7] != tob[3][3]){
if(tob[3][7] != tob[2][3]){
if(tob[2][7] != tob[1][3]){
spin (1, dir*(-1));
}
spin(2, dir);
}
spin(3, dir*(-1));
}
spin(num, dir);
}
}
int main(){
for(int i = 1; i <= 4; i++){
for(int j = 1; j <= 8; j++){
scanf("%1d", &tob[i][j]);
}
}
scanf("%d", &k);
while(k--){
int tobNum, dir;
scanf("%d %d", &tobNum, &dir);
solution(tobNum, dir);
}
int sum = 0;
if(tob[1][1] == 1) sum += 1;
if(tob[2][1] == 1) sum += 2;
if(tob[3][1] == 1) sum += 4;
if(tob[4][1] == 1) sum += 8;
printf("%d\n", sum);
}
'알고리즘과 자료구조 > 백준' 카테고리의 다른 글
BOJ 14888 연산자 끼워넣기 (0) | 2020.11.01 |
---|---|
BOJ 13458 시험 감독 (0) | 2020.11.01 |
BOJ 2018 수들의 합 5 (0) | 2020.10.26 |
BOJ 11005 진법 변환 2 (0) | 2020.10.22 |
BOJ 14889 스타트와 링크 (0) | 2020.10.20 |