Algorithm/BOJ

14891. 톱니바퀴

 

 

톱니바퀴를 회전시키는 문제이다. 

 

주요조건

 

1. 맞닿아있는 극이 서로 같으면 안움직인다.

2. 맞닿아있는 극이 서로 같으면 서로 반대방향으로 돌아간다.

 

 

 

 

 

 

 

더보기
더보기
import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static int ans;
    public static int[][] Gear = new int[4][8];
    public static boolean[] Check_Gear;

    public static void InputData() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk;

        for(int i = 0; i < 4; i++){
            String str = br.readLine();
            for(int j = 0; j < 8; j++){
                Gear[i][j] = Integer.parseInt(String.valueOf(str.charAt(j)));
            }
        }

        stk = new StringTokenizer(br.readLine(), " ");
        int k = Integer.parseInt(stk.nextToken());

        while(k > 0){
            stk = new StringTokenizer(br.readLine(), " ");
            int number = Integer.parseInt(stk.nextToken());
            boolean Clockwise = Integer.parseInt(stk.nextToken()) == 1;

            Check_Gear = new boolean[4];

            ClockMove(number - 1, Clockwise);

            k--;
        }

        for(int i = 0, point = 1; i < 4; i++, point *= 2){
            if(Gear[i][0] == 1)
                ans += point;
        }

        br.close();
    } // 데이터 입력과 동시에 진행

    public static void ClockMove(int number, boolean clockwise) {
        Check_Gear[number] = true;

        if(number < 3 && ( Gear[number][2] != Gear[number + 1][6] ) && !Check_Gear[number + 1]){
            ClockMove(number + 1, !clockwise);
        }// 톱니바퀴 우측 체크

        if(number > 0 && ( Gear[number][6] != Gear[number - 1][2] )&& !Check_Gear[number - 1]){
            ClockMove(number - 1, !clockwise);
        }// 톱니바퀴 좌측 체크

        if(clockwise){
            int tmp = Gear[number][7];
            for(int i = 7; i > 0; i--){
                Gear[number][i] = Gear[number][i - 1];
            }
            Gear[number][0] = tmp;
        }else{
            int tmp = Gear[number][0];
            for(int i = 0; i < 7; i++){
                Gear[number][i] = Gear[number][i + 1];
            }
            Gear[number][7] = tmp;
        }
    }

    public static void Print_result() throws IOException {
        BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(String.valueOf(ans));
        bw.flush(); bw.close();
    }
    // 결과 출력




    public static void main(String[] args) throws IOException{
        InputData();
        Print_result();
    }
}