[백준 / 골드5] 14891 톱니바퀴 (Java)

Ilhwanee·2022년 10월 18일
0

코딩테스트

목록 보기
114/155
post-custom-banner

문제 보기



사용한 것

  • 왼쪽, 오른쪽으로 연속적인 회전을 구현하기 위한 재귀 함수


풀이 방법

  • 톱니바퀴 회전 입력 값마다 operate()로 톱니바퀴를 작동시킨다.
  • 하나가 돌아가면 나머지도 돌아갈 수 있으므로 leftRotate(), rightRotate()를 호출한다.
  • leftRotate()의 경우 index가 벗어나거나 같은 극이여서 회전하지 못하는 경우 return하고 나머지 경우는 연속적으로 회전할 수도 있으니 재귀호출 한다.
  • rightRoate()도 위와 같다.
  • 단, 재귀 호출이 끝난 후 shift()를 통하여 회전시킨다. 회전을 먼저 시키면 이미 배열 값이 바뀌므로 회전 가능 여부(다른 극)를 판단하기 힘들다.
  • 마지막으로 getAnswer()를 호출하여 답을 출력한다.


코드

public class Main {

    public static final int NUM_OF_GEARS = 4;
    public static final int NUM_OF_SAWS = 8;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[][] dArr = new int[NUM_OF_GEARS][NUM_OF_SAWS];
        for (int i = 0; i < NUM_OF_GEARS; i++) {
            String line = br.readLine();
            for (int j = 0; j < NUM_OF_SAWS; j++) {
                dArr[i][j] = line.charAt(j) == '1' ? 1 : -1;
            }
        }

        int k = Integer.parseInt(br.readLine());
        for (int i = 0; i < k; i++) {
            String[] split = br.readLine().split(" ");
            int num = Integer.parseInt(split[0]) - 1;
            int dir = Integer.parseInt(split[1]);

            operate(dArr, num, dir);
        }

        System.out.println(getAnswer(dArr));
    }

    public static void operate(int[][] dArr, int num, int dir) {
        leftRotate(dArr, num - 1, -dir);
        rightRotate(dArr, num + 1, -dir);
        shift(dArr[num], dir);
    }

    public static void leftRotate(int[][] dArr, int num, int dir) {
        if (num < 0 || dArr[num][2] == dArr[num + 1][6]) {
            return;
        }

        leftRotate(dArr, num - 1, -dir);
        shift(dArr[num], dir);
    }

    public static void rightRotate(int[][] dArr, int num, int dir) {
        if (num >= NUM_OF_GEARS || dArr[num][6] == dArr[num - 1][2]) {
            return;
        }

        rightRotate(dArr, num + 1, -dir);
        shift(dArr[num], dir);
    }

    public static void shift(int[] arr, int dir) {
        if (dir == 1) {
            int tmp = arr[NUM_OF_SAWS - 1];
            for (int i = NUM_OF_SAWS - 2; i >= 0; i--) {
                arr[i + 1] = arr[i];
            }
            arr[0] = tmp;
        } else {
            int tmp = arr[0];
            for (int i = 1; i < NUM_OF_SAWS; i++) {
                arr[i - 1] = arr[i];
            }
            arr[NUM_OF_SAWS - 1] = tmp;
        }
    }

    public static int getAnswer(int[][] dArr) {
        int answer = 0;
        for (int i = 0; i < NUM_OF_GEARS; i++) {
            if (dArr[i][0] == 1) {
                answer += Math.pow(2, i);
            }
        }

        return answer;
    }
}


profile
블로그 이전 -> https://pppp0722.github.io
post-custom-banner

0개의 댓글