https://www.acmicpc.net/problem/14891
풀이
빡구현문제이다. 너무 힘들다..
우선 시계, 반시계 방향으로 회전시키는 함수를 만든다.
1. 이차원 배열 lists[4][8]에 모든 톱니바퀴의 정보를 저장한다.
2. 회전하는 톱니바퀴의 번호와 방향을 입력받는다.
3. 시작 톱니바퀴의 양 끝 인덱스(다른 톱니와 맞닿아 있는 곳) 2, 6 인덱스의 정보를 가져온다.
4. 그 후 방향을 확인 후 현재 톱니바퀴를 회전 시킨다.
5. 시작 톱니바퀴의 오른쪽 톱니바퀴들을 회전시킨다.
5-1. 오른쪽 톱니바퀴의 2, 6번 인덱스를 가져온다.
5-2. 오른쪽 톱니바퀴의 6번 인덱스가 그 전 톱니바퀴의 2번 인덱스 값과 다르다면 회전
5-3. 마지막 톱니바퀴까지 반복
6. 시작 톱니바퀴의 왼쪽 톱니바퀴들을 회전시킨다.
6-1~3. 5번과 동일하게 실행(인덱스는 반대로)
7. 저장된 톱니바퀴 배열에서 0번째 값들을 가져와 S극인지 확인
8. i번째 톱니바퀴는 2의 i승만큼 결과에 더하기
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_14891_톱니바퀴 {
public static int k;
public static int[][] lists = new int[4][8];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<4; i++){
String str = br.readLine();
for(int j =0; j<8; j++){
lists[i][j]=Integer.parseInt(String.valueOf(str.charAt(j)));
}
}
k = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<k; i++){
st = new StringTokenizer(br.readLine());
int idx = Integer.parseInt(st.nextToken())-1;
int dir = Integer.parseInt(st.nextToken());
//인덱스 6, 2이 맞닿아있음
//오른쪽부터
int statR = lists[idx][2];
int statL = lists[idx][6];
if(dir == -1) rotateR(idx);
else rotateL(idx);
int idx2 = idx;
int dir2 = dir;
while(idx2 < 3){
int left = lists[idx2+1][6];
int right = lists[idx2+1][2];
//극이 다르면 회전
if (statR != left) {
//오른쪽애는 시계회전
if(dir2 == 1){
rotateR(idx2 + 1);
dir2 = -1;
}else{
rotateL(idx2 + 1);
dir2 = 1;
}
}
//극 같으면 끝
else{
break;
}
statR = right;
idx2++;
}
//왼쪽
idx2 = idx;
dir2 = dir;
while(idx2 > 0){
int left = lists[idx2-1][6];
int right = lists[idx2-1][2];
//극이 다르면 회전
if (statL != right) {
//오른쪽애는 시계회전
if(dir2 == 1){
rotateR(idx2 - 1);
dir2 = -1;
}else{
rotateL(idx2 - 1);
dir2 = 1;
}
}
//극 같으면 끝
else{
break;
}
statL = left;
idx2--;
}
}
int answer =0;
for(int i=0; i<4; i++){
if(lists[i][0] == 1) answer += Math.pow(2, i);
}
System.out.println(answer);
}
public static void rotateL(int idx){
for(int k = 7; k>=1; k--){
int tmp = lists[idx][k-1];
lists[idx][k-1] = lists[idx][k];
lists[idx][k] = tmp;
}
}
public static void rotateR(int idx){
for(int k=0; k<=6; k++){
int tmp = lists[idx][k+1];
lists[idx][k+1] = lists[idx][k];
lists[idx][k] = tmp;
}
}
}