문제풀기 : [백준14891 톱니바퀴]
package sw;
import java.io.*;
public class Main14891_톱니바퀴 {
static int K;
static int[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
arr = new int[4][8];
String input;
for(int i=0; i<4; i++) {
input = br.readLine().trim();
for(int j=0; j<8; j++) {
arr[i][j] = input.charAt(j) - 48;
}
}
K = Integer.parseInt(br.readLine().trim());
String[] input2;
int point, direct;
for(int i=0; i<K; i++) {
input2 = br.readLine().trim().split(" ");
point = Integer.parseInt(input2[0])-1;
direct = Integer.parseInt(input2[1]);
play(point,direct);
}
int res=0;
int d = 1;
for(int i=0; i<4; i++) {
res += (arr[i][0]*d);
d*=2;
}
System.out.println(res);
}
static int[] move;
static boolean[] visit;
static void play(int point, int direct) {
move = new int[4]; // 각 톱니 회전방향
move[point] = direct; // 최초 선택한 톱니 방향
visit = new boolean[4]; // 회전한 톱니 방문 체
visit[point] = true; // 최초 회전한 톱니방
dfs(point,direct); // 선택한 톱니를 기준으로 양방향으로 돌아가는 톱니 dfs로 체
for(int i=0; i<4; i++) {// 각 톱니 회전방향에 따른 이동
shift(i,move[i]);
}
}
static int[][] dir = {{-1,0},{1,0}};
static boolean check(int x) {
if(x>=0 && x<arr.length)
return true;
else return false;
}
static void dfs(int point, int direct){
int dx;
if(direct==0) return; // 회전방향이 없으면 양방향 톱니에도 영향을 주지 않는다.
for(int d=0; d<2; d++) {
dx = point+dir[d][0];
if(check(dx) && !visit[dx]) { // 회할 수 있는 톱니 체크
if(d==0 ) {
if(arr[point][6] != arr[dx][2]) { // 선택한 톱니 기준 왼쪽 톱니와 극이 다르면
move[dx] = direct==1?-1:1; // 반댓 방향으로 회전
}
}else {
if(arr[point][2] != arr[dx][6]) { // 선택한 톱니 기준 오른쪽 톱니와 극이 다르
move[dx] = direct==1?-1:1; // 반댓 방향으로 회전
}
}
visit[dx]=true; // 방문 체크
dfs(dx,move[dx]); // 양방향의 톱니로 이동
}
}
}
static void shift(int point, int direct) { // 톱니 회전
int tmp;
if(direct == 1) { // 시계방향
tmp = arr[point][7];
for(int i=7; i>0; i--) {
arr[point][i] = arr[point][i-1];
}
arr[point][0]=tmp;
}else if(direct == -1){ // 반시계방향
tmp = arr[point][0];
for(int i=0; i<7; i++) {
arr[point][i] = arr[point][i+1];
}
arr[point][7]=tmp;
}
}
}
PREVIOUS[삼성기출]백준14888 - 연산끼워넣기