본문 바로가기

코딩 테스트/백준(java)

Q14891번: 톱니바퀴

반응형

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

정답 비율이 52퍼일정도로, 문제는 쉬운편이에요.

문제는 다들 이해 하셨죠?

 

알고리즘도 쉬운편인데, 어떤식으로 구현하냐가 문제네요.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {

    static BufferedReader br;
    static final int left = -1, right = 1;
    static LinkedList<LinkedList<Integer>> gears = new LinkedList<>();

    static int resultValue = 0;
    public static void main(String[] args) throws Exception {

        inputGear(); //기어 정보 입력 
        inputRotation(); //로테이션 정보 입력 

        System.out.println(gears.get(0).get(0) + (gears.get(1).get(0) * 2) + (gears.get(2).get(0) * 4) + (gears.get(3).get(0) * 8));
    }

    static void inputGear() throws Exception {
        br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;

        for (int j = 0; j < 4; j++) {
            st = new StringTokenizer(br.readLine());
            String input = st.nextToken();
            LinkedList<Integer> gear = new LinkedList<>();

            for (int k = 0; k < input.length(); k++) {
                if (input.charAt(k) == '1') {
                    gear.add(1);
                } else {
                    gear.add(0);
                }
            }
            gears.add(gear); //기어를 입력받아 저장 
        }
        // System.out.println("input");
        // showGear();
    }

    static void inputRotation() throws Exception {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int inputNum = Integer.parseInt(st.nextToken());

        for (int i = 0; i < inputNum; i++) {
            st = new StringTokenizer(br.readLine());
            int gearNum = Integer.parseInt(st.nextToken());
            int direction = Integer.parseInt(st.nextToken());
            // System.out.println(gearNum-1 + ", " + direction);
            rotateFirstGear(gearNum-1, direction); //기어를 돌립니다
            // showGear();
        }
    }

    static void rotateFirstGear(int gearNum, int direction) {
        if (gearNum < 3 && gears.get(gearNum).get(2) != gears.get(gearNum+1).get(6)) { //오른쪽 기어를 돌릴지 확인하여 동작 
            rotateRightGear(gearNum+1, direction * -1);
        }

        if (0 < gearNum && gears.get(gearNum).get(6) != gears.get(gearNum-1).get(2)) { //왼쪽 기어를 돌릴지 확인 하여 동작 
            rotateLeftGear(gearNum-1, direction * -1);
        }

        rotateGear(gearNum, direction);
    }

    static void rotateRightGear(int gearNum, int direction) {
        if (gearNum < 3 && gears.get(gearNum).get(2) != gears.get(gearNum+1).get(6)) { //오른쪽 기어를 돌릴지 확인하여 동작
            rotateRightGear(gearNum+1, direction * -1);
        }

        rotateGear(gearNum, direction);
    }

    static void rotateLeftGear(int gearNum, int direction) {
        if (0 < gearNum && gears.get(gearNum).get(6) != gears.get(gearNum-1).get(2)) { //왼쪽 기어를 돌릴지 확인 하여 동작
            rotateLeftGear(gearNum-1, direction * -1);
        }

        rotateGear(gearNum, direction);
    }

    static void rotateGear(int gearNum, int direction) {
        if (direction == left) {
            // System.out.println(gearNum + "번째 기어를 왼쪽 으로 돌린다");
            int tempValue = gears.get(gearNum).removeFirst();
            gears.get(gearNum).addLast(tempValue);
        } else {
            // System.out.println(gearNum + "번째 기어를 오른쪽 으로 돌린다");
            int tempValue = gears.get(gearNum).removeLast();
            gears.get(gearNum).addFirst(tempValue);
        }
    }

    static void showGear() {
System.out.println();
System.out.println("      " + gears.get(0).get(0) + "      " + "      " + gears.get(1).get(0) + "     " + "     " + gears.get(2).get(0) + "     " + "     " + gears.get(3).get(0) + "      ");
System.out.println("  " + gears.get(0).get(7) + "        " + gears.get(0).get(1) + "  " + "  " + gears.get(1).get(7) + "     " + gears.get(1).get(1) + "  " + "  " + gears.get(2).get(7) + "     " + gears.get(2).get(1) + "  " + "  " + gears.get(3).get(7) + "     " + gears.get(3).get(1) + "  ");
System.out.println(gears.get(0).get(6) + "            " + gears.get(0).get(2) + gears.get(1).get(6) + "         " + gears.get(1).get(2) + gears.get(2).get(6) + "         " + gears.get(2).get(2) + gears.get(3).get(6) + "          " + gears.get(3).get(2));
System.out.println("  " + gears.get(0).get(5) + "        " + gears.get(0).get(3) + "  " + "  " + gears.get(1).get(5) + "     " + gears.get(1).get(3) + "  " + "  " + gears.get(2).get(5) + "     " + gears.get(2).get(3) + "  " + "  " + gears.get(3).get(5) + "     " + gears.get(3).get(3) + "  ");
System.out.println("      " + gears.get(0).get(4) + "      " + "      " + gears.get(1).get(4) + "     " + "     " + gears.get(2).get(4) + "      " + "    " + gears.get(3).get(4) + "      ");
System.out.println("------------------------");
    }
}

 

첫번째로 돌릴 기어에 따른 케이스별로 메소드를 하나하나 구현 할 수도 있지만,

문제의 정답만 맞추는 거라 생각하여, 재활용 할 수 있는 메소드를 구현해봤습니다.

 

첫번째 기어 로테이션 전에, 먼저 오른쪽 기어 체크와 왼쪽 기어 체크 메소드 수행 후 첫번째 기어를 로테이션 합니다.

오른쪽 기어 체크 메소드는, 그 오른쪽 기어 체크 메소드 수행 후 로테이션을 수행합니다.

그럼, 오른쪽 기어 체크 메소드를 호출하면 해당 기어의 오른쪽 기어 체크 메소드 수행 후 로테이션을 수행하겠죠?

넹 맞아요. 재귀로 구현했습니다

 

핵심은 로테이션 전에, 기어를 돌릴지 확인하는거죠.

 

주석을 풀어서 돌려보면 이해하기 쉬울거에요.

반응형

'코딩 테스트 > 백준(java)' 카테고리의 다른 글

DP - 1463. 1로 만들기  (0) 2021.03.25
DP - 2839. 설탕 배달  (0) 2021.03.25
Q14890: 경사로  (0) 2021.03.20
백준 2193) 이친수  (0) 2017.09.16
백준 1149) RGB거리  (0) 2017.09.16