[백준] 14981 톱니바퀴 (골드5)

AI·2025년 10월 16일

첫 아이디어>

// 12시 방향부터 시계 방향대로 입력 gear[5][8] - 0은 더미
// 회전 방향 입력
// 회전하는 톱니바퀴 + 방향;1=시계, -1=반시계
// 인덱스를 활용하여 회전 시킴 or, sl, sr, tl, tr, fl
// 회전할때 3시, 9시 방향을 기준으로 돌리것과 반대 방향으로 돌아감. 값이 다를 경우만
// 12시방향값으로 점수내기 -s(1)일때만 점수=톱니바퀴 번호만큼 점수 발생
로 생각

=>
각 톱니바퀴가 회전할지, 회전한다면 어떤 방향으로 돌지를 저장할 배열 필요 - 돌리기전 상태 파악을 위해
동일한 코드를 위해 인덱스가 아니라 계속 회전 시키기 - 시간복잡도가 크면 안되지만, 84k(100)번 계산으로 값이 많이 안크기에 진행

점수 파악을 잘못함 -> 이럴꺼면 굳이 gear[5][8]가 아니라 gear[4][8] 사용이 나음

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int[][] gear = new int[5][8];
    static int k;
    static int[] rotate = new int[5];
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 12시 방향부터 시계 방향대로 입력 gear[5][8]
        for(int i=0;i<4;i++){
            String val = br.readLine();
            for(int j=0;j<8;j++){
                gear[i+1][j] = val.charAt(j) - '0';
            }
        }
        k = Integer.parseInt(br.readLine());

        for(int i=0;i<k;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int g = Integer.parseInt(st.nextToken());
            int r = Integer.parseInt(st.nextToken());
            Arrays.fill(rotate,0); // 초기화
            rotate[g]=r;
            // 회전하는 톱니바퀴 + 방향;1=시계, -1=반시계
            // 회전할때 3시, 9시 방향을 기준으로 돌리것과 반대 방향으로 돌아감. 값이 다를 경우만
            // 왼쪽 회전
            for(int j=g;j>1;j--){
                if(gear[j][6] != gear[j-1][2]){
                    rotate[j-1] = -rotate[j]; // 부호 반전
                }
                else break;
            }
            // 오른쪽 회전
            for(int j=g;j<4;j++){
                if(gear[j][2] != gear[j+1][6]){
                    rotate[j+1] = -rotate[j];
                }
                else break;
            }
            // 실제 회전
            for(int j=1;j<=4;j++){
                if(rotate[j] == 1){ // 시계 방향
                    int tmp = gear[j][7];
                    for(int k=7;k>0;k--){
                        gear[j][k] = gear[j][k-1];
                    }
                    gear[j][0] = tmp;
                }
                else if(rotate[j] == -1){ // 반시계 방향
                    int tmp = gear[j][0];
                    for(int k=1;k<8;k++){
                        gear[j][k-1] = gear[j][k];
                    }
                    gear[j][7] = tmp;
                }
            }
        }
        
        // 12시방향값으로 점수내기 - s(1)일때만 점수=톱니바퀴 번호가 아니라 2^톱니바퀴 번호
        int ans = 0;
        for(int i=1;i<=4;i++){
            if(gear[i][0]==1) ans += 1<<(i-1); 
        }
        System.out.println(ans);
    }

}

0개의 댓글