알고리즘

[백준 14891 JAVA] 톱니바퀴

begong 2024. 3. 19. 12:56
반응형

 

 

구현문제

 

문제에 로직이 다 나와있어서 구현을 어떻게 하느냐가 중요한 문제이다.

 

톱니바퀴끼리 바라보는것을 검사하고, 조건이 만족하면 돌리면된다.

 

나는 큐를 두개로 나누어 돌릴바퀴의정보를 담는 큐, 탐색을 위한 큐를 만들었다. 

이렇게 한 이유는 톱늬를 미리 돌려버리면 조건을 검사하기 상당히 까다롭기때문에 검사를 마친 뒤 톱니바퀴를 한번에 돌리기 위해서이다.

 

톱니를 돌리는 것은 간단하게 배열을 이용했다. 길이가 8이라서 굳이 다른 자료구조를 이용할 필요가 없을것이라 생각했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

class Main {
    static int[][] wheel = new int[4][8];

    //2<->6 <바퀴> 2<->6
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        for (int i = 0; i < 4; i++) {
            line = br.readLine();
            for (int j = 0; j < 8; j++) {
                wheel[i][j] = Integer.parseInt(String.valueOf(line.charAt(j)));
            }
        }
        int K = Integer.parseInt(br.readLine());

        StringTokenizer st;
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            turnLogic(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }
        int answer = 0;
        if (wheel[0][0] == 1) answer += 1;
        if (wheel[1][0] == 1) answer += 2;
        if (wheel[2][0] == 1) answer += 4;
        if (wheel[3][0] == 1) answer += 8;
        System.out.println(answer);
    }

    public static void turnLogic(int wheelNum, int dir) {
        int[] dx = {-1, 1};
        Queue<Turn> searchQ = new ArrayDeque<>();
        Queue<Turn> q = new ArrayDeque<>();
        searchQ.add(new Turn(wheelNum - 1, dir));
        q.add(new Turn(wheelNum - 1, dir));
        boolean[] visit = new boolean[4];
        visit[wheelNum - 1] = true;
        while (!searchQ.isEmpty()) {
            Turn cur = searchQ.poll();
            for (int i = 0; i < 2; i++) {
                int newWheel = cur.wheel + dx[i];
                if (newWheel >= 4 || newWheel < 0 || visit[newWheel]) continue;
                visit[newWheel] = true;
                if (i == 0 && wheel[cur.wheel][6] != wheel[newWheel][2]) {
                    searchQ.add(new Turn(newWheel, -cur.dir));
                    q.add(new Turn(newWheel, -cur.dir));
                } else if (i == 1 && wheel[cur.wheel][2] != wheel[newWheel][6]) {
                    searchQ.add(new Turn(newWheel, -cur.dir));
                    q.add(new Turn(newWheel, -cur.dir));
                }
            }
        }
        while (!q.isEmpty()) {
            Turn cur = q.poll();
            turnWheel(cur.wheel, cur.dir);
        }
    }

    public static void turnWheel(int wheelNum, int dir) {
        int[] target = wheel[wheelNum];
        if (dir == 1) {
            int move = target[0];
            for (int i = 0; i < 7; i++) {
                int second = target[i + 1];
                target[i + 1] = move;
                move = second;
            }
            target[0] = move;
        } else if (dir == -1) {
            int move = target[7];
            for (int i = 7; i > 0; i--) {
                int second = target[i - 1];
                target[i - 1] = move;
                move = second;
            }
            target[7] = move;
        }
//        System.out.println(wheelNum);
//        for (int i : wheel[wheelNum]) {
//            System.out.print(i + " ");
//        }
    }
}

class Turn {
    int wheel, dir;

    public Turn(int wheel, int dir) {
        this.wheel = wheel;
        this.dir = dir;
    }
}

 

반응형