[Algorithm] 백준 14891 톱니바퀴 java

lnnae·2020년 6월 29일
0

Algorithm

목록 보기
34/40

문제

N극과 S극 중에 하나를 나타내고 있는 4개의 바퀴를 회전시켜야한다. 회전은 한 칸씩만 회전한다.

	0
  7   	     1
6    		2
  5          3
  	4

바퀴의 2번, 6번 방향을 비교해서 각 극이 다르다면 현재 회전한 방향과 반대 방향으로, 같다면 회전하지 않는다.
회전시킬 톱니바퀴와 회전 방향을 입력받고, 서로 맞닿아있는 바퀴를 비교해서 회전시킨 후 12시 방향의 톱니바퀴 방향으로 점수를 매겨서 총 점수의 합을 출력한다.

풀이

  • int[][] wheel : 전체 바퀴를 저장한다.

  • int[] isValid : 회전하는 방향을 저장한다. (0이면 움직이지 않고, 1이면 시계 -1이면 반시계)

  • check(int wheelNum, int dir) : 입력으로 들어오는 바퀴 방향과 회전 방향을 받아서 해당 바퀴의 왼쪽, 오른쪽 바퀴의 극을 체크한다.
    이때 양 극이 달라서 회전할 수 있다면 재귀 호출해서 계속 검사한다.
    각 바퀴마다 isValid에 회전 방향을 저장한다.

  • rotate(isValid) : isValid에 저장된 방향으로 각 바퀴를 회전시킨다.

소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ_14891 {
    static int[][] wheel = new int[4][8];
    static int[] isValid; // 회전하는 방향 저장 (0이면 no 이동)

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (int i = 0; i < 4; i++) {
            String[] input = br.readLine().split("");
            for (int j = 0; j < 8; j++) {
                wheel[i][j] = Integer.parseInt(input[j]);
            }
        }

        int round = Integer.parseInt(br.readLine());

        for (int i = 0; i < round; i++) {
            String[] input = br.readLine().split(" ");
            isValid = new int[4];

            int wheelNum = Integer.parseInt(input[0]) - 1;
            int dir = Integer.parseInt(input[1]);

            check(wheelNum, dir);
            rotate(isValid);
        }

        System.out.println(calc());
    }

    static int calc() {
        int sum = 0;
        for (int i = 0; i < 4; i++) {
            int num = wheel[i][0];

            if (num == 1) {
                sum += Math.pow(2, i);
            }
        }
        return sum;
    }

    static void check(int wheelNum, int dir) {
        isValid[wheelNum] = dir;

        int prev = wheelNum - 1;
        int next = wheelNum + 1;

        if (prev >= 0 && isValid[prev] == 0) {
            // 왼쪽 바퀴 검사
            if (wheel[prev][2] != wheel[wheelNum][6]) {
                check(prev, dir * -1);
            }
        }

        if (next <= 3 && isValid[next] == 0) {
            //오른쪽 바퀴 검사
            if (wheel[next][6] != wheel[wheelNum][2]) {
                check(next, dir * -1);
            }
        }
    }

    static void rotate(int[] isValid) {
        for (int i = 0; i < 4; i++) {
            if (isValid[i] != 0) {
                int[] temp = new int[8];

                int idx;
                for (int j = 0; j < 8; j++) {
                    idx = j + isValid[i];

                    if (idx == -1) {
                        idx = 7;
                    } else if (idx == 8) {
                        idx = 0;
                    }

                    temp[idx] = wheel[i][j];
                }

                wheel[i] = temp;
            }
        }
    }
}
profile
이내임니당 :>

0개의 댓글