[삼성기출]백준14891 - 톱니바퀴

 
by 박신종


문제풀기 : [백준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;
		}
		
	}
}