N극과 S극 중에 하나를 나타내고 있는 4개의 바퀴를 회전시켜야한다. 회전은 한 칸씩만 회전한다.
0
7 1
6 2
5 3
4
바퀴의 2번, 6번 방향을 비교해서 각 극이 다르다면 현재 회전한 방향과 반대 방향으로, 같다면 회전하지 않는다.
회전시킬 톱니바퀴와 회전 방향을 입력받고, 서로 맞닿아있는 바퀴를 비교해서 회전시킨 후 12시 방향의 톱니바퀴 방향으로 점수를 매겨서 총 점수의 합을 출력한다.
int[][] wheel : 전체 바퀴를 저장한다.
int[] isValid : 회전하는 방향을 저장한다. (0이면 움직이지 않고, 1이면 시계 -1이면 반시계)
check(int wheelNum, int dir)
: 입력으로 들어오는 바퀴 방향과 회전 방향을 받아서 해당 바퀴의 왼쪽, 오른쪽 바퀴의 극을 체크한다.
이때 양 극이 달라서 회전할 수 있다면 재귀 호출해서 계속 검사한다.
각 바퀴마다 isValid에 회전 방향을 저장한다.
rotate(isValid)
: isValid에 저장된 방향으로 각 바퀴를 회전시킨다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_14891 {
static int[][] wheel = new int[4][8];
static int[] isValid; // 회전하는 방향 저장 (0이면 no 이동)
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 4; i++) {
String[] input = br.readLine().split("");
for (int j = 0; j < 8; j++) {
wheel[i][j] = Integer.parseInt(input[j]);
}
}
int round = Integer.parseInt(br.readLine());
for (int i = 0; i < round; i++) {
String[] input = br.readLine().split(" ");
isValid = new int[4];
int wheelNum = Integer.parseInt(input[0]) - 1;
int dir = Integer.parseInt(input[1]);
check(wheelNum, dir);
rotate(isValid);
}
System.out.println(calc());
}
static int calc() {
int sum = 0;
for (int i = 0; i < 4; i++) {
int num = wheel[i][0];
if (num == 1) {
sum += Math.pow(2, i);
}
}
return sum;
}
static void check(int wheelNum, int dir) {
isValid[wheelNum] = dir;
int prev = wheelNum - 1;
int next = wheelNum + 1;
if (prev >= 0 && isValid[prev] == 0) {
// 왼쪽 바퀴 검사
if (wheel[prev][2] != wheel[wheelNum][6]) {
check(prev, dir * -1);
}
}
if (next <= 3 && isValid[next] == 0) {
//오른쪽 바퀴 검사
if (wheel[next][6] != wheel[wheelNum][2]) {
check(next, dir * -1);
}
}
}
static void rotate(int[] isValid) {
for (int i = 0; i < 4; i++) {
if (isValid[i] != 0) {
int[] temp = new int[8];
int idx;
for (int j = 0; j < 8; j++) {
idx = j + isValid[i];
if (idx == -1) {
idx = 7;
} else if (idx == 8) {
idx = 0;
}
temp[idx] = wheel[i][j];
}
wheel[i] = temp;
}
}
}
}