사용한 것
- 왼쪽, 오른쪽으로 연속적인 회전을 구현하기 위한 재귀 함수
풀이 방법
- 톱니바퀴 회전 입력 값마다
operate()
로 톱니바퀴를 작동시킨다.
- 하나가 돌아가면 나머지도 돌아갈 수 있으므로
leftRotate()
, rightRotate()
를 호출한다.
leftRotate()
의 경우 index가 벗어나거나 같은 극이여서 회전하지 못하는 경우 return하고 나머지 경우는 연속적으로 회전할 수도 있으니 재귀호출 한다.
rightRoate()
도 위와 같다.
- 단, 재귀 호출이 끝난 후
shift()
를 통하여 회전시킨다. 회전을 먼저 시키면 이미 배열 값이 바뀌므로 회전 가능 여부(다른 극)를 판단하기 힘들다.
- 마지막으로
getAnswer()
를 호출하여 답을 출력한다.
코드
public class Main {
public static final int NUM_OF_GEARS = 4;
public static final int NUM_OF_SAWS = 8;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[][] dArr = new int[NUM_OF_GEARS][NUM_OF_SAWS];
for (int i = 0; i < NUM_OF_GEARS; i++) {
String line = br.readLine();
for (int j = 0; j < NUM_OF_SAWS; j++) {
dArr[i][j] = line.charAt(j) == '1' ? 1 : -1;
}
}
int k = Integer.parseInt(br.readLine());
for (int i = 0; i < k; i++) {
String[] split = br.readLine().split(" ");
int num = Integer.parseInt(split[0]) - 1;
int dir = Integer.parseInt(split[1]);
operate(dArr, num, dir);
}
System.out.println(getAnswer(dArr));
}
public static void operate(int[][] dArr, int num, int dir) {
leftRotate(dArr, num - 1, -dir);
rightRotate(dArr, num + 1, -dir);
shift(dArr[num], dir);
}
public static void leftRotate(int[][] dArr, int num, int dir) {
if (num < 0 || dArr[num][2] == dArr[num + 1][6]) {
return;
}
leftRotate(dArr, num - 1, -dir);
shift(dArr[num], dir);
}
public static void rightRotate(int[][] dArr, int num, int dir) {
if (num >= NUM_OF_GEARS || dArr[num][6] == dArr[num - 1][2]) {
return;
}
rightRotate(dArr, num + 1, -dir);
shift(dArr[num], dir);
}
public static void shift(int[] arr, int dir) {
if (dir == 1) {
int tmp = arr[NUM_OF_SAWS - 1];
for (int i = NUM_OF_SAWS - 2; i >= 0; i--) {
arr[i + 1] = arr[i];
}
arr[0] = tmp;
} else {
int tmp = arr[0];
for (int i = 1; i < NUM_OF_SAWS; i++) {
arr[i - 1] = arr[i];
}
arr[NUM_OF_SAWS - 1] = tmp;
}
}
public static int getAnswer(int[][] dArr) {
int answer = 0;
for (int i = 0; i < NUM_OF_GEARS; i++) {
if (dArr[i][0] == 1) {
answer += Math.pow(2, i);
}
}
return answer;
}
}