코딩문제풀이/Baekjoon

[Java] 백준 14891번 : 톱니바퀴

코딩하는 포메라니안 2023. 3. 3. 15:14

1. 문제

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

 

2. 풀이과정

문제대로 구현하면 되는 문제이고, 톱니바퀴를 회전할 때는 배열의 모든 값을 오른쪽 혹은 왼쪽으로 움직이지 않고 시작 포인트만 변경해서 얼만큼 회전했는지 표현했다.

그리고 가장 왼쪽, 오른쪽의 값은 나머지 연산을 통해 시작에서 각각 2번째, 6번째에 떨어진 값을 반환하도록 했다.

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

public class Main {

    static class Wheel{
        int start;
        int[] ns;

        public Wheel(){
            start = 0;
            ns = new int[8];
        }

        public void turn(int dir){
            start = (dir == 1) ? (start + 7)%8 : (start + 1)%8;
        }

        public int getTop(){
            return ns[start];
        }

        public int getLeft(){
            return ns[(start+6)%8];
        }

        public int getRight(){
            return ns[(start+2)%8];
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        Wheel[] wheels = new Wheel[4];

        for(int i=0; i<4; i++){
            wheels[i] = new Wheel();
            String input = br.readLine();
            for(int j=0; j<8; j++){
                wheels[i].ns[j] = input.charAt(j) - '0';
            }
        }

        int N = Integer.parseInt(br.readLine());
        while(N-- > 0){
            st = new StringTokenizer(br.readLine());
            int no = Integer.parseInt(st.nextToken()) - 1;
            int dir = Integer.parseInt(st.nextToken());
            goLeft(wheels, no - 1, (dir == 1) ? -1 : 1);
            goRight(wheels, no + 1, (dir == 1) ? -1 : 1);
            wheels[no].turn(dir);
        }

        int result = 0;
        for(int i=0; i<4; i++){
            result |= (wheels[i].getTop()<<i);
        }
        System.out.println(result);
    }

    public static void goLeft(Wheel[] wheels, int no, int dir){
        if(no < 0){
            return;
        }
        if(wheels[no].getRight() != wheels[no + 1].getLeft()){
            goLeft(wheels, no - 1, (dir==1) ? -1 : 1);
            wheels[no].turn(dir);
        }
    }

    public static void goRight(Wheel[] wheels, int no, int dir){
        if(no >= 4){
            return;
        }
        if(wheels[no].getLeft() != wheels[no - 1].getRight()){
            goRight(wheels, no + 1, (dir==1)? -1 : 1);
            wheels[no].turn(dir);
        }
    }

}

 

 

결과