문제/백준

[백준] 14891 톱니바퀴 - Java

icodesiuuuu 2025. 1. 25. 00:36

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

 

문제 개요

 총 4개의 톱니바퀴가 일렬로 배치되어 있으며, 각 톱니바퀴는 N극(0)과 S극(1)으로 이루어진 8개의 톱니를 가지고 있습니다. 사용자는 톱니바퀴를 회전시킬 때, 서로 맞닿은 톱니의 극에 따라 다른 톱니바퀴도 영향을 받아 회전할 수 있습니다. 주어진 회전 명령에 따라 톱니바퀴를 회전시키고, 최종 상태를 기반으로 점수를 계산하는 문제입니다.

 

 

접근 방법

  1. 톱니바퀴 상태 및 회전 명령 초기화
    • 4개의 톱니바퀴 상태를 2차원 배열로 저장하였습니다.
    • 각 회전 명령은 번호와 방향을 담은 객체로 관리하였습니다.
  2. 회전 방향 결정
    • 특정 톱니바퀴를 회전시키면, 맞닿은 톱니의 극(N극과 S극)을 확인하여 인접 톱니바퀴가 회전할지 여부를 결정했습니다.
    • 이를 위해 회전 시작 톱니바퀴의 왼쪽과 오른쪽을 각각 탐색하며, 영향을 받는 톱니바퀴들의 회전 방향을 결정하였습니다.
  3. 톱니바퀴 회전 구현
    • 시계 방향 회전과 반시계 방향 회전을 각각 함수로 구현하여, 결정된 회전 방향에 따라 배열을 수정하였습니다.
  4. 최종 점수 계산
    • 각 톱니바퀴의 12시 방향 값에 따라 점수를 계산하였습니다. 톱니바퀴 번호에 따라 가중치(1, 2, 4, 8)를 적용하여 점수를 합산하였습니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int[][] cogs = new int[4][8]; // 톱니바퀴 배열
    static List<Node> cmd = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        init();
        turnCog();
        System.out.println(calCogState());
    }

    public static int calCogState() {
        int answer = 0;
        answer += cogs[0][0] == 1 ? 1 : 0;
        answer += cogs[1][0] == 1 ? 2 : 0;
        answer += cogs[2][0] == 1 ? 4 : 0;
        answer += cogs[3][0] == 1 ? 8 : 0;
        return answer;
    }

    public static void turnCog() {
        for (Node command : cmd) {
            int targetCog = command.num - 1;
            int dir = command.dir;

            int[] directions = new int[4];
            directions[targetCog] = dir;

            for (int i = targetCog - 1; i >= 0; i--) {
                if (cogs[i][2] != cogs[i + 1][6]) { 
                    directions[i] = -directions[i + 1];
                } else {
                    break;
                }
            }

            for (int i = targetCog + 1; i < 4; i++) {
                if (cogs[i - 1][2] != cogs[i][6]) {
                    directions[i] = -directions[i - 1];
                } else {
                    break;
                }
            }

            for (int i = 0; i < 4; i++) {
                if (directions[i] == 1) {
                    rotateClockwise(cogs[i]);
                } else if (directions[i] == -1) {
                    rotateCounterClockwise(cogs[i]);
                }
            }
        }
    }

    public static void rotateClockwise(int[] cog) {
        int temp = cog[7];
        for (int i = 7; i > 0; i--) {
            cog[i] = cog[i - 1];
        }
        cog[0] = temp;
    }

    public static void rotateCounterClockwise(int[] cog) {
        int temp = cog[0];
        for (int i = 0; i < 7; i++) {
            cog[i] = cog[i + 1];
        }
        cog[7] = temp;
    }

    public static void init() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 4; i++) {
            cogs[i] = br.readLine().chars().map(c -> c - '0').toArray();
        }

        int k = Integer.parseInt(br.readLine());
        for (int i = 0; i < k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(st.nextToken());
            int dir = Integer.parseInt(st.nextToken());
            cmd.add(new Node(num, dir));
        }
    }

    static class Node {
        int num, dir;

        public Node(int num, int dir) {
            this.num = num;
            this.dir = dir;
        }
    }
}

'문제 > 백준' 카테고리의 다른 글

[백준 / Java] 2467 용액  (1) 2025.02.21
[백준] 20437 문자열 게임 2 - Java  (1) 2025.01.27
[백준] 14890 경사로 - Java  (1) 2025.01.24
[백준] 14503 로봇 청소기 - Java  (1) 2025.01.19
[백준] 14499 주사위 굴리기 - Java  (0) 2025.01.18