https://www.acmicpc.net/problem/14891
회전하는 톱니바퀴의 3시와 오른쪽 톱니바퀴의 9시와 비교, 9시와 왼쪽 톱니바퀴의 3시 비교
회전을 할 때 비교해줘야할 톱니의 위치에 대해 정확하게 설정을 해준다면 문제는 쉽게 풀린다.
반복문을 통해 현재 위치에서 좌우 톱니바퀴를 비교하고 서로 다르면 회전하도록 한다. 만약 같다면 그 즉시 반복문을 빠져나온다.
그리고 톱니의 회전은 시계방향의 경우 right shift, 반시계방향은 left shift라고 생각하고 튕겨져 나가는 톱니를 시작 위치에 대입해주면 간단하게 회전할 수 있다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Gear[] gears = new Gear[4];
String[] line;
for (int i = 0; i < 4; i++) {
line = br.readLine().split("");
int[] arr2 = Arrays.stream(line).mapToInt(Integer::parseInt).toArray();
gears[i] = new Gear(arr2, i + 1);
}
int k = Integer.parseInt(br.readLine());
HashMap<Gear, Integer> map = new HashMap<>();
for (int t = 0; t < k; t++) {
line = br.readLine().split(" ");
int num = Integer.parseInt(line[0]) - 1;
int dir = Integer.parseInt(line[1]);
Gear now = gears[num];
// 오른쪽 탐색
map.clear();
map.put(now, dir);
int tempDir = dir * -1;
for (int i = num + 1; i < 4; i++) {
if (gears[i - 1].edge[2] != gears[i].edge[6]) {
map.put(gears[i], tempDir);
tempDir *= -1;
} else
break;
}
tempDir = -1 * dir;
for (int i = num - 1; i >= 0; i--) {
if (gears[i].edge[2] != gears[i + 1].edge[6]) {
map.put(gears[i], tempDir);
tempDir *= -1;
} else
break;
}
for(Gear gear : map.keySet()) {
rotate(gear, map.get(gear));
}
}
int sum = 0;
for (int i = 0; i < 4; i++) {
int num = gears[i].edge[0];
if (num == 1) {
sum = sum + (1 << i);
}
}
bw.write(sum + "\n");
bw.flush();
bw.close();
br.close();
}
private static void rotate(Gear gear, int dir) {
//1 시계 right shift, 2 반시계 left shift
int temp;
if (dir == 1) {
temp = gear.edge[7];
for (int i = 7; i > 0; i--) {
gear.edge[i] = gear.edge[i - 1];
}
gear.edge[0] = temp;
} else if (dir == -1) {
temp = gear.edge[0];
for (int i = 0; i < 7; i++) {
gear.edge[i] = gear.edge[i + 1];
}
gear.edge[7] = temp;
}
}
}
class Gear {
// N극은 0, S극은 1
int[] edge;
int num;
public Gear(int[] edge, int num) {
this.edge = edge;
this.num = num;
}
@Override
public String toString() {
return "Gear{" +
"edge=" + Arrays.toString(edge) +
", num=" + num +
'}';
}
}