본문 바로가기
카테고리 없음

[백준] 14891 톱니바퀴 - Java

by 쌩욱 2021. 11. 28.

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

풀이

빡구현문제이다. 너무 힘들다..

우선 시계, 반시계 방향으로 회전시키는 함수를 만든다.

 

1. 이차원 배열 lists[4][8]에 모든 톱니바퀴의 정보를 저장한다.

 

2. 회전하는 톱니바퀴의 번호와 방향을 입력받는다.

 

3. 시작 톱니바퀴의 양 끝 인덱스(다른 톱니와 맞닿아 있는 곳) 2, 6 인덱스의 정보를 가져온다.

 

4. 그 후 방향을 확인 후 현재 톱니바퀴를 회전 시킨다.

 

5. 시작 톱니바퀴의 오른쪽 톱니바퀴들을 회전시킨다.

   5-1. 오른쪽 톱니바퀴의 2, 6번 인덱스를 가져온다.

   5-2. 오른쪽 톱니바퀴의 6번 인덱스가 그 전 톱니바퀴의 2번 인덱스 값과 다르다면 회전

   5-3. 마지막 톱니바퀴까지 반복

 

6. 시작 톱니바퀴의 왼쪽 톱니바퀴들을 회전시킨다.

   6-1~3. 5번과 동일하게 실행(인덱스는 반대로)

 

7. 저장된 톱니바퀴 배열에서 0번째 값들을 가져와 S극인지 확인

 

8. i번째 톱니바퀴는 2의 i승만큼 결과에 더하기

 

전체 코드

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

public class BOJ_14891_톱니바퀴 {
    public static int k;
    public static int[][] lists = 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 str = br.readLine();
            for(int j =0; j<8; j++){
                lists[i][j]=Integer.parseInt(String.valueOf(str.charAt(j)));
            }
        }

        k = Integer.parseInt(br.readLine());
        StringTokenizer st;
        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());


            //인덱스 6, 2이 맞닿아있음

            //오른쪽부터
            int statR = lists[idx][2];
            int statL = lists[idx][6];
            if(dir == -1) rotateR(idx);
            else rotateL(idx);

            int idx2 = idx;
            int dir2 = dir;
            while(idx2 < 3){
                int left = lists[idx2+1][6];
                int right = lists[idx2+1][2];
                //극이 다르면 회전
                if (statR != left) {
                    //오른쪽애는 시계회전
                    if(dir2 == 1){
                        rotateR(idx2 + 1);
                        dir2 = -1;
                    }else{
                        rotateL(idx2 + 1);
                        dir2 = 1;
                    }
                }
                //극 같으면 끝
                else{
                    break;
                }
                statR = right;
                idx2++;
            }

            //왼쪽
            idx2 = idx;
            dir2 = dir;
            while(idx2 > 0){
                int left = lists[idx2-1][6];
                int right = lists[idx2-1][2];
                //극이 다르면 회전
                if (statL != right) {
                    //오른쪽애는 시계회전
                    if(dir2 == 1){
                        rotateR(idx2 - 1);
                        dir2 = -1;
                    }else{
                        rotateL(idx2 - 1);
                        dir2 = 1;
                    }
                }
                //극 같으면 끝
                else{
                    break;
                }
                statL = left;
                idx2--;
            }

        }
        int answer =0;
        for(int i=0; i<4; i++){
            if(lists[i][0] == 1) answer += Math.pow(2, i);
        }
        System.out.println(answer);
    }

    public static void rotateL(int idx){
        for(int k = 7; k>=1; k--){
            int tmp = lists[idx][k-1];
            lists[idx][k-1] = lists[idx][k];
            lists[idx][k] = tmp;
        }
    }
    public static void rotateR(int idx){
        for(int k=0; k<=6; k++){
            int tmp = lists[idx][k+1];
            lists[idx][k+1] = lists[idx][k];
            lists[idx][k] = tmp;
        }
    }
}