알고리즘

백준 14891번 톱니바퀴 (JAVA)

박카스마시며코딩 2023. 11. 8. 21:35

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

저는 구현을 통해 문제를 해결하였습니다.

먼저 LinkedList로 톱니들을 표현하였고, 회전하는 톱니의 왼쪽 오른쪽으로의 자성을 체크하여, 돌아가는지 돌아간다면 회전 방향은 어떻게 되는지를 확인 후, 한번에 회전시켰습니다. 체크를 먼저하고 그 다음 모든 톱니바퀴를 해당 하는 회전 방향으로 회전하였습니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    private static final int LEFT_INDEX = 6;
    private static final int RIGHT_INDEX = 2;
    private static final int CLOCK_DIR = 1;
    private static final int REVERSE_CLOCK_DIR = -1;
    private static final int[] SCORE = {1,2,4,8};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        LinkedList<Integer>[] gears = new LinkedList[4];
        for (int i = 0; i < 4; i++) {
            gears[i] = new LinkedList<>();
            String command = br.readLine();
            for (int j = 0; j < 8; j++) {
                char ch = command.charAt(j);
                gears[i].add(Integer.parseInt(ch + ""));
            }
        }
        int k = Integer.parseInt(br.readLine());
        for (int i = 0; i < k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int number = Integer.parseInt(st.nextToken())-1;
            int dir = Integer.parseInt(st.nextToken());
            moveGears(gears, number, dir);
        }
        int totalScore = 0;
        for(int i = 0 ; i < 4; i++){
            totalScore += SCORE[i] * gears[i].get(0);
        }
        System.out.println(totalScore);
    }

    private static void moveGears(LinkedList<Integer>[] gears, int number, int dir) {
        int[] gearDir = new int[4];
        gearDir[number] = dir;
        int now = number + 1;
        while (now < 4) {
            if (gears[now].get(LEFT_INDEX) != gears[now - 1].get(RIGHT_INDEX)) {
                gearDir[now] = -gearDir[now - 1];
                now++;
            }else{
                break;
            }
        }
        now = number - 1;
        while (now >= 0) {
            if (gears[now].get(RIGHT_INDEX) != gears[now + 1].get(LEFT_INDEX)) {
                gearDir[now] = -gearDir[now + 1];
                now--;
            }else{
                break;
            }
        }
        for(int i = 0 ; i < 4 ; i++){
            moveGear(gears[i],gearDir[i]);
        }
    }

    private static void moveGear(LinkedList<Integer> gear, int clockDir) {
        if (clockDir == CLOCK_DIR) {
            gear.offerFirst(gear.pollLast());
        } else if(clockDir == REVERSE_CLOCK_DIR){
            gear.offerLast(gear.pollFirst());
        }
    }
}