[백준] 15662 톱니바퀴 (2) - JAVA

2025. 1. 27. 11:26·Algorithm

백준 15662 톱니바퀴 (2) Gold V - JAVA 📌

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

문제 설명

문제 풀이


접근 💡

사실 이 문제는 엄청난 아이디어를 떠올려야 한다기 보다는 문제에서 주어진 조건 그대로 구현하면 되는 시뮬레이션 문제이다.

 

이 문제에 접근하기 위해 가장 중요하게 생각해야 하는 부분은 톱니바퀴가 회전하면 양 옆 톱니바퀴는 반대로 회전하게 된다는 것이다.

이 점을 활용하여 문제에 천천히 접근해보자.

 

우선 테스트케이스 1번을 살펴보자.

 

4개의 톱니바퀴가

10101111

01111101

11001110

0000010

 

으로 되어있다. 톱니바퀴의 12시부터 차례로 0, 1, 2 ... 인덱스가 부여된다.

우리가 살펴봐야 할 부분은 톱니바퀴가 맞물리는 2번 인덱스와 6번 인덱스이다.

 

현재 톱니바퀴가 시계방향으로 회전하면 오른쪽 톱니바퀴는 반시계 방향으로 회전하게 되는데, 오른쪽 톱니바퀴의 6번 인덱스와 현재 톱니바퀴의 2번 인덱스의 값이 달라야 회전할 수 있다. 만약 회전할 수 있다면 다음 오른쪽 톱니바퀴는 또 반시계의 반시계방향인 시계방향으로 회전하게 된다.

 

따라서 현재 회전한 톱니바퀴의 오른쪽, 왼쪽을 모두 검사 후 하나씩 회전시켜주면 모든 톱니바퀴가 회전한 최종 톱니바퀴의 상태가 도출된다. 코드로 살펴보자.

코드 💡

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

public class Main {

    static int N, K, ans;
    static int[][] wheels;

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

        N = Integer.parseInt(br.readLine());
        wheels = new int[N][8];
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            for (int j = 0; j < 8; j++) {
                wheels[i][j] = str.charAt(j) - '0';
            }
        }

        K = Integer.parseInt(br.readLine());
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int idx = Integer.parseInt(st.nextToken()) - 1;
            int dir = Integer.parseInt(st.nextToken());

            rotateLeft(idx - 1, -dir);
            rotateRight(idx + 1, -dir);
            rotate(idx, dir);
        }
        
        ans = 0;
        for (int i = 0; i < N; i++) {
            if (wheels[i][0] == 1) ans++;
        }
        System.out.println(ans);
    }

    private static void rotateLeft(int idx, int dir) {
        if (idx < 0 || wheels[idx][2] == wheels[idx + 1][6]) {
            return;
        }

        rotateLeft(idx - 1, -dir);
        rotate(idx, dir);
    }

    private static void rotateRight(int idx, int dir) {
        if (idx >= N || wheels[idx][6] == wheels[idx - 1][2]) {
            return;
        }

        rotateRight(idx + 1, -dir);
        rotate(idx, dir);
    }

    private 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;
        }
    }
}

 

 

 

 

 

 

'Algorithm' 카테고리의 다른 글

[백준] 18428 감시 피하기 - JAVA  (1) 2025.02.02
[백준] 3980 선발 명단 - JAVA  (0) 2025.01.29
[백준] 2156 포도주 시식 -JAVA  (0) 2025.01.27
[백준] 2512 예산 - JAVA  (0) 2025.01.19
[알고리즘] Topological Sort - 위상 정렬  (2) 2024.11.10
'Algorithm' 카테고리의 다른 글
  • [백준] 18428 감시 피하기 - JAVA
  • [백준] 3980 선발 명단 - JAVA
  • [백준] 2156 포도주 시식 -JAVA
  • [백준] 2512 예산 - JAVA
의중
의중
  • 의중
    개발어려워
    의중
  • 전체
    오늘
    어제
    • 전체글 (31) N
      • Algorithm (12)
      • SSAFY (1)
      • 자료구조 (4)
      • 운영체제 (2)
      • JAVA (2)
      • ML, DL (0)
      • BackEnd (4)
      • DevOps (1)
      • 네트워크 (3)
      • DB, SQL (2) N
  • hELLO· Designed By정상우.v4.10.3
의중
[백준] 15662 톱니바퀴 (2) - JAVA
상단으로

티스토리툴바