이 문제는 시물레이션 문제이다.
처음에 문제를 이해할때 예시가 이해가 안돼서 좀 찾아봤다.
일단 1번 2번 3번 4번의 톱니바퀴가 있다. 만약 2번의 맞닿는 극이 왼쪽은 N극 오른쪽은 S극이고 시계방향으로 돌린다고 한다면 1번의 맞닿는 오른쪽 극은 S이므로 2번의 N극과 상반되기 때문에 반시계방향으로 돌린다.
3번을 본다면 2번 맞닿는 오른쪽 극은 S이고 3번 맞닿는 왼쪽 극도 S이므로 같기 때문에 돌리지 않는다. 그러면 4번도 무시하고 진행하면 된다.
이런 흐름으로 이루어진다고 생각하면 된다. 그리고 주의해야할 점이 있는데 맞닿는 면들이 서로 상반된다고 바로 돌리고 주위 톱니바퀴와 비교하는 것이 아니고 돌리기 전에 맞닿는 면을 비교해야한다.
즉 다 비교하고 톱니를 돌려야 한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
public static int[] first = new int[8];
public static int[] second = new int[8];
public static int[] third = new int[8];
public static int[] fourth = new int[8];
public static int[][] gears = new int[5][8];
public static int[] rotateGear = new int[5];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 0은 N극, 1은 S극
for(int i=1;i<5;i++){
String[] arr = br.readLine().split("");
for(int j=0;j<arr.length;j++){
gears[i][j] = Integer.parseInt(arr[j]);
}
}
// for(int i=1;i<gears.length;i++){
// System.out.println(Arrays.toString(gears[i]));
// }
// System.out.println(Arrays.toString(first));
// System.out.println(Arrays.toString(second));
int n = Integer.parseInt(br.readLine());
for(int i=0;i<n;i++){
String[] arr = br.readLine().split(" ");
int selectGear = Integer.parseInt(arr[0]);
int direction = Integer.parseInt(arr[1]);
//오른쪽이 2, 왼쪽이 6
checkRotate(selectGear, direction);
// System.out.println("rotateGear");
// System.out.println(Arrays.toString(rotateGear));
rotate();
}
int result = answer();
System.out.println(result);
}
public static void checkRotate(int gear, int direction){
// 1이면 시계방향, -1이면 반시계 방향
rotateGear = new int[5];
//2로 초기화하고 시계방향이면 1, 반시계방향이면 -1, 기어가 똑같으면 0으로 초기화
Arrays.fill(rotateGear, 2);
rotateGear[gear] = direction;
int currentGear = gear;
Queue<Integer> queue = new LinkedList<>();
queue.add(gear);
// 왼쪽 2번톱니바퀴랑 오른쪽 6번 톱니바퀴랑 비교해야됨
while(!queue.isEmpty()){
int element = queue.poll();
// if(element != gear && rotateGear[element] == 0) break;
int prev = element - 1;
int next = element + 1;
if(prev > 0 && rotateGear[prev] == 2){
//앞에 톱니와 현재 톱니가 맞닿은 부분이 다를 경우
if(gears[prev][2] != gears[element][6]){
rotateGear[prev] = rotateGear[element] * -1;
queue.add(prev);
} else{
rotateGear[prev] = 0;
}
}
if(next < 5 && rotateGear[next] == 2){
//앞에 톱니와 현재 톱니가 맞닿은 부분이 다를 경우
if(gears[next][6] != gears[element][2]){
rotateGear[next] = rotateGear[element] * -1;
queue.add(next);
} else{
rotateGear[next] = 0;
}
}
}
}
public static void rotate(){
for(int i=1;i<5;i++){
int[] newArr = new int[8];
//반시계 방향
if(rotateGear[i] == -1){
// newArr[1] = gears[i][2]
for(int j=0;j<8;j++){
newArr[j] = gears[i][(j+1) % 8];
}
for(int j=0;j<8;j++){
gears[i][j] = newArr[j];
}
}
//시계방향
if(rotateGear[i] == 1){
//newArr[1] gears[i][0]
for(int j=0;j<8;j++){
if(j == 0){
newArr[j] = gears[i][7];
} else{
newArr[j] = gears[i][j-1];
}
}
for(int j=0;j<8;j++){
gears[i][j] = newArr[j];
}
}
}
}
public static int answer(){
int sum = 0;
// for(int i=1;i<gears.length;i++){
// System.out.println(Arrays.toString(gears[i]));
// }
if(gears[1][0] == 1){
sum += 1;
}
if(gears[2][0] == 1){
sum += 2;
}
if(gears[3][0] == 1){
sum += 4;
}
if(gears[4][0] == 1){
sum += 8;
}
return sum;
}
}