백준 14891 풀이

남기용·2021년 8월 25일
0

백준 풀이

목록 보기
98/109

톱니바퀴

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


풀이

회전하는 톱니바퀴의 3시와 오른쪽 톱니바퀴의 9시와 비교, 9시와 왼쪽 톱니바퀴의 3시 비교

회전을 할 때 비교해줘야할 톱니의 위치에 대해 정확하게 설정을 해준다면 문제는 쉽게 풀린다.

반복문을 통해 현재 위치에서 좌우 톱니바퀴를 비교하고 서로 다르면 회전하도록 한다. 만약 같다면 그 즉시 반복문을 빠져나온다.

그리고 톱니의 회전은 시계방향의 경우 right shift, 반시계방향은 left shift라고 생각하고 튕겨져 나가는 톱니를 시작 위치에 대입해주면 간단하게 회전할 수 있다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Gear[] gears = new Gear[4];
        String[] line;
        for (int i = 0; i < 4; i++) {
            line = br.readLine().split("");
            int[] arr2 = Arrays.stream(line).mapToInt(Integer::parseInt).toArray();
            gears[i] = new Gear(arr2, i + 1);
        }

        int k = Integer.parseInt(br.readLine());
        HashMap<Gear, Integer> map = new HashMap<>();
        for (int t = 0; t < k; t++) {
            line = br.readLine().split(" ");
            int num = Integer.parseInt(line[0]) - 1;
            int dir = Integer.parseInt(line[1]);
            Gear now = gears[num];
            // 오른쪽 탐색
            map.clear();
            map.put(now, dir);
            int tempDir = dir * -1;
            for (int i = num + 1; i < 4; i++) {
                if (gears[i - 1].edge[2] != gears[i].edge[6]) {
                    map.put(gears[i], tempDir);
                    tempDir *= -1;
                } else
                    break;
            }
            tempDir = -1 * dir;
            for (int i = num - 1; i >= 0; i--) {
                if (gears[i].edge[2] != gears[i + 1].edge[6]) {
                    map.put(gears[i], tempDir);
                    tempDir *= -1;
                } else
                    break;
            }
            for(Gear gear : map.keySet()) {
                rotate(gear, map.get(gear));
            }
        }

        int sum = 0;
        for (int i = 0; i < 4; i++) {
            int num = gears[i].edge[0];
            if (num == 1) {
                sum = sum + (1 << i);
            }
        }
        bw.write(sum + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

    private static void rotate(Gear gear, int dir) {
        //1 시계 right shift, 2 반시계 left shift
        int temp;
        if (dir == 1) {
            temp = gear.edge[7];
            for (int i = 7; i > 0; i--) {
                gear.edge[i] = gear.edge[i - 1];
            }
            gear.edge[0] = temp;
        } else if (dir == -1) {
            temp = gear.edge[0];
            for (int i = 0; i < 7; i++) {
                gear.edge[i] = gear.edge[i + 1];
            }
            gear.edge[7] = temp;
        }
    }

}

class Gear {
    // N극은 0, S극은 1
    int[] edge;
    int num;

    public Gear(int[] edge, int num) {
        this.edge = edge;
        this.num = num;
    }

    @Override
    public String toString() {
        return "Gear{" +
                "edge=" + Arrays.toString(edge) +
                ", num=" + num +
                '}';
    }
}
profile
개인용 공부한 것을 정리하는 블로그입니다.

0개의 댓글