[백준] 14891 - 톱니바퀴

eunseon·2021년 9월 29일
1

백준 - 14891 톱니바퀴

톱니바퀴 문제는 구현 문제이다. 😇

내 생각 ❗️
1. 톱니바퀴를 int형 배열에 넣는다.
2. 방향이 변경되어야 하는 톱니바퀴를 Change[]배열에 넣는다.
(이 배열에 값이 있다면 방향 변경 필수)
3. 시계 방향인지 반시계 방향인지 체크하여 clockwise(), reclockwise()에 넣어 돌린다.
4. 점수를 계산한다.


이미지 출처 - 백준 - 14891 톱니바퀴

Java 풀이

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

public class Main_14891_톱니바퀴 {
    public static void main(String ... args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int [][] Gear = new int [5][9];

        for(int i = 1; i<= 4; i++){
            String str = br.readLine();
            for(int j = 1; j<=8; j++){
                Gear[i][j] = str.charAt(j-1) -'0';
            }
        }
        int k = Integer.parseInt(br.readLine());
        int rotation [][] = new int [k+1][3];
        for(int i= 1; i<=k; i++){
            //회전시킨 톱니바퀴의 번호, 방향이 주어진다.
            st = new StringTokenizer(br.readLine());
            for(int j = 1; j<=2; j++){
                rotation[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        rotate(Gear,rotation,k);
       int result = score(Gear);
       System.out.println(result);
       return;
    }

    private static int score(int[][] gear) {
        int result = 0;
        for(int i= 1 ; i<=2; i++){
            if(gear[i][1] == 1){
                result += i;
            }
        }//end of for
        for(int i= 3 ; i<=4; i++){
            if(gear[i][1] == 1 && i == 3){
                result += 4;
            }else if(gear[i][1] == 1 && i == 4){
                result += 8;
            }
        }//end of for
        return result;
    }//end of score method

    private static void rotate(int[][] gear, int[][] rotation, int k) {
        for(int i= 1; i<=k; i++){
           int rogear = rotation[i][1];
           int rodir = rotation[i][2];
           int [] change = new int [5];
           changeRogear(rogear, rodir, gear, change);
           realRotate(gear, change);

        }
    }//end of rotate method

    private static void realRotate(int[][] gear, int[] change) {
        for(int i= 1; i<=4; i++){
            if(change[i] == 1){
                clockwise(i,gear);
            }
            if(change[i] == -1){
                reclockwise(i,gear);
            }
        }
    }

    private static void reclockwise(int idx, int[][] gear) {
        int change [] = new int [9];
        for(int i = 1; i<=8; i++){
            if(i == 8){
                change[i] = gear[idx][1];
            }
            else {
                change[i] = gear[idx][i+1];
            }
        }
        for(int i = 1; i<=8; i++){
            gear[idx][i] = change[i];
        }
    }

    private static void clockwise(int idx, int[][] gear) {
        int change [] = new int [9];
        for(int i = 1; i<=8; i++){
            if(i == 1){
                change[i] = gear[idx][8];
            }
            else {
                change[i] = gear[idx][i-1];
            }
        }
        for(int i = 1; i<=8; i++){
            gear[idx][i] = change[i];
        }
    }

    private static void changeRogear(int rogear, int rodir, int[][] gear, int [] change) {
        int rerodir = 0;
        if(rodir == 1)
            rerodir = -1;
        else
            rerodir = 1;
        switch (rogear) {
            case 1:
                if (gear[1][3] == gear[2][7])
                    change[1] = rodir;
                else {
                    change[1] = rodir;
                    if(change[2] == 0) {
                        changeRogear(2, rerodir, gear, change);
                    }
                }
                break;
            case 2:
                if (gear[2][3] == gear[3][7]) {
                    change[2] = rodir;
                }
                else {
                    change[2] = rodir;
                    if(change[3] == 0)
                    changeRogear(3,rerodir, gear, change);
                }
                if (gear[2][7] == gear[1][3])
                    change[2] = rodir;
                else {
                    change[2] = rodir;
                    if(change[1] == 0)
                    changeRogear(1,rerodir, gear, change);
                }
                break;
            case 3:
                if (gear[3][3] == gear[4][7])
                    change[3] = rodir;
                else {
                    change[3] = rodir;
                    if(change[4] == 0)
                    changeRogear(4,rerodir, gear, change);
                }
                if (gear[3][7] == gear[2][3])
                    change[3] = rodir;
                else {
                    change[3] = rodir;
                    if(change[2] == 0)
                    changeRogear(2,rerodir, gear, change);
                }
                break;
            case 4:
                if (gear[4][7] == gear[3][3])
                    change[4] = rodir;
                else {
                    change[4] = rodir;
                    if(change[3] == 0)
                    changeRogear(3,rerodir, gear, change);
                }
                break;
        }//end of change switch
    }//end of changeRogear method
}//end of class

이 문제에 대한 회고 👩🏻‍💻 ❤️‍🔥
1. 자바 8에 생긴 람다식을 자주 사용하지 않는 편인데 람다식을 하면 확실히 코드가 간편해지는 것 같아 비슷한 문제가 나오면 사용해봐야겠다.
2. 변수명과 함수명을 좀 더 분명한 네이밍과 적절한 주석처리가 필요하다.
3. 이 문제를 푼 뒤, 다른 분들의 코드를 보았는데 너무나 간편하게 하셔서 여기서 좀 더 간편하게 줄이는 방법(1과 같은 방법)을 생각하고, 적용해보는 것의 필요함을 느꼈다.

0개의 댓글