14891번 톱니바퀴 4개 k번 회전시키기

딱 2시간 걸림. 집중이 너무 안돼… java 기본 문법도 너무 모르겠고 ㅠ_ㅠ 딱히 알고리즘이 적용된 건 아닌… 구현 문제

import java.util.*;  
import java.io.*;  
  
public class BJ_14891 {  
  
    static int[][] gear = new int[4][8];  
  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        int num = 0;  
        int direction = 0;  
        int score = 0;  
  
        for(int i=0; i<4; i++) {  
            gear[i] = br.readLine().chars().toArray();  
        }  
  
        int k = Integer.parseInt(br.readLine());  
  
        for(int i=0; i<k; i++) {  
            StringTokenizer st = new StringTokenizer(br.readLine());  
            num = Integer.parseInt(st.nextToken()) - 1;  
            direction = Integer.parseInt(st.nextToken());  
            rotate(num, direction, true, true);  
        }  
  
        for(int i=0; i<4; i++) {  
            // S극이면 +2^i
            if(gear[i][0] == '1') {  
                score += Math.pow(2.0, i * 1.0);  
            }  
        }  
  
        System.out.println(score);  
    }  
  
    public static void rotate(int num, int direction, boolean left, boolean right) {  
        if (num > 0) {  
            if (gear[num][6] != gear[num - 1][2] && left == true) {  
                rotate(num - 1, direction * -1, true, false);  
            }  
        }  
  
        if (num < 3) {  
            if (gear[num][2] != gear[num + 1][6] && right == true) {  
                rotate(num + 1, direction * -1, false, true);  
            }  
        }  
  
        int[] temp = Arrays.copyOf(gear[num], gear[num].length);  
  
        if (direction == 1) {  
            for (int idx = 1; idx < 8; idx++) {  
                gear[num][idx] = temp[idx - 1];  
            }  
            gear[num][0] = temp[7];  
        } else {  
            for (int idx = 0; idx < 7; idx++) {  
                gear[num][idx] = temp[idx + 1];  
            }  
            gear[num][7] = temp[0];  
        }  
    }  
}

이렇게 input 넣는게 최선인가?…

		for(int i=0; i<4; i++) {
			String line = br.readLine();
			for(int j=0; j<8; j++) {
				data[i][j] = line.charAt(j)-'0';
			}
		}

아 신기하다 나처럼 left right로 무한루프 방지한게 아니라 왼쪽도는거 오른쪽 도는거를 따로 했네

static void gearOperation(int idx, int dir) {
		// 왼쪽 (0 ~ idx-1)
		leftSide(idx-1, -dir);
		// 오른쪽 (idx+1 ~ 3) 
		rightSide(idx+1, -dir);
		rotation(idx,dir);
	}
	
	static void leftSide(int idx, int dir) {
		if(idx < 0) return;
		if(data[idx][2]==data[idx+1][6]) return;
		leftSide(idx-1, -dir);
		rotation(idx,dir);
	}
	
	static void rightSide(int idx, int dir) {
		if(idx > 3) return;
		if(data[idx][6] == data[idx-1][2]) return;
		rightSide(idx+1, -dir);
		rotation(idx,dir);
	}
	
	static void rotation(int idx, int dir) {
		if(dir==1) {
			int tmp = data[idx][7];
			for(int i=7; i>0; i--) {
				data[idx][i] = data[idx][i-1];
			}
			data[idx][0] = tmp;
		}else {
			int tmp = data[idx][0];
			for(int i=0; i<7; i++) {
				data[idx][i] = data[idx][i+1];
			}
			data[idx][7] = tmp;
		}
	}

Deque을 요소로 가지는 array로 갖고 싶었는데 이런 식으로 ArrayDeque 요소 4개 선언하고. new 객체 선언하면서 써야하나봄.

static ArrayList<Integer>[] t = new ArrayList[4];

        for(int i=0; i<4; i++){
            String[] tmp = br.readLine().split("");

            t[i] = new ArrayList<>();
            for(String e:tmp){
                t[i].add(Integer.parseInt(e));
            }
        }