백준 톱니바퀴

KIMYEONGJUN·2026년 3월 12일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다.
상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다.
다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다.
각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다.
방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.

총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력한다.
점수란 다음과 같이 계산한다.
1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점

내가 이 문제를 보고 생각해본 부분

입력받기: 4개의 톱니바퀴 상태를 2차원 배열 wheels[4][8]에 저장한다. 
0은 N극, 1은 S극이다.
회전 횟수 K만큼 반복: 각 회전 명령에 대해 회전할 톱니바퀴 번호와 방향을 읽는다.
rotateAll 함수:
먼저 회전하려는 톱니바퀴와 방향을 저장한다.
왼쪽으로 연쇄적으로 영향을 주는 톱니바퀴에 대해 각 톱니 맞닿는 위치(왼쪽의 인덱 6 vs 오른쪽 인덱 2)를 비교해 극이 다르면 반대 방향으로 회전한다.
오른쪽도 동일하게 진행한다.
이렇게 하면 어느 톱니바퀴가 어느 방향으로 돌아야 할지 배열 rotations에 저장된다.
이후 모든 톱니바퀴에 대해 rotate 함수를 호출해 한 칸씩 회전시킨다.
rotate 함수:
시계 방향일 때는 톱니 하나 우측으로 이동, 반시계 방향일 때는 좌측으로 이동하는 방식이다.
점수 계산:
12시 방향(index 0)이 S극(1)인 톱니바퀴들에 대해 1, 2, 4, 8 점수를 부여해 합산한다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 14891번 문제
public class Main1325 {
    static int[][] wheels = new int[4][8];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for(int i = 0; i < 4; i++) {
            String line = br.readLine();
            for (int j = 0; j < 8; j++) {
                wheels[i][j] = line.charAt(j) - '0';
            }
        }

        int K = Integer.parseInt(br.readLine());
        for(int i = 0; i < K; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int wheelNum = Integer.parseInt(st.nextToken()) - 1; // 0-based index
            int direction = Integer.parseInt(st.nextToken());
            rotateAll(wheelNum, direction);
        }

        int score = 0;
        for (int i = 0; i < 4; i++) {
            if (wheels[i][0] == 1) { // 12시 방향이 S극이면 점수 부여
                score += (1 << i);   // 1, 2, 4, 8 점수
            }
        }
        System.out.println(score);
        br.close();
    }

    static void rotateAll(int wheelNum, int direction) {
        int[] rotations = new int[4]; // -1, 0, 1 회전 방향 저장
        rotations[wheelNum] = direction;

        // 왼쪽 톱니바퀴 방향 결정
        for (int i = wheelNum; i > 0; i--) {
            if (wheels[i][6] != wheels[i - 1][2]) {
                rotations[i - 1] = -rotations[i];
            } else {
                break;
            }
        }
        // 오른쪽 톱니바퀴 방향 결정
        for (int i = wheelNum; i < 3; i++) {
            if (wheels[i][2] != wheels[i + 1][6]) {
                rotations[i + 1] = -rotations[i];
            } else {
                break;
            }
        }
        // 회전 적용
        for (int i = 0; i < 4; i++) {
            if (rotations[i] != 0) {
                rotate(i, rotations[i]);
            }
        }
    }

    static void rotate(int idx, int dir) {
        if (dir == 1) { // 시계 방향
            int temp = wheels[idx][7];
            for (int i = 7; i > 0; i--) {
                wheels[idx][i] = wheels[idx][i - 1];
            }
            wheels[idx][0] = temp;
        } else { // 반시계 방향
            int temp = wheels[idx][0];
            for (int i = 0; i < 7; i++) {
                wheels[idx][i] = wheels[idx][i + 1];
            }
            wheels[idx][7] = temp;
        }
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글