자바생
Published 2021. 10. 18. 10:48
자바(백준) 14891 톱니바퀴 BOJ(Java)
728x90

오답 노트 & 새로 알게 된 점

시뮬레이션은 문제를 이해하는 것이 중요한 것 같다.

 

이 문제에서 중요한 부분은 맞물리는 곳이 같으면 움직이지 않고, 다르면 움직인다.

옆에 것이 움직이지 않으면 맞물리는 곳 상관없이 움직이지 않는다.

맞물리는 곳을 비교할 때는, 회전하고 비교하는 것이 아니라 한 번에 비교하고 한 번에 회전해야한다

 

기능 별로 메서드를 만든다면 문제를 푸는 데 더욱 수월할 것이다.

 

시계 방향으로 회전하는 메서드, 반시계 방향으로 회전하는 메서드,

어디 방향으로 회전해야하는지 알려주는 메서드, 어떻게 회전해야하는지 알려주는 메서드가 있다.

 

어떻게 코드를 줄여야하는지 몰라서, 일단 맞고나보자하고 하드코딩을 했다.

그리고 톱니 하나를 일반화시킨다고 생각하여 재귀를 이용하여 풀었다.

 


코드1(재귀)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package Simulation;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class BOJ14891 {
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
 
    static int flag[] = new int[5]; //false면 반시계 true면 시계
    static int arr[][] = new int[5][8];
    static int K;
    static boolean visit[];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        for (int i = 1; i <= 4; i++) {
            String s = br.readLine();
            for (int j = 0; j < 8; j++) {
                arr[i][j] = s.charAt(j) - '0';
            }
        }
 
        K = atoi(br.readLine());
 
        for (int i = 0; i < K; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int target = atoi(st.nextToken());
            int direction = atoi(st.nextToken());
            Arrays.fill(flag, 0);
            visit = new boolean[5];
 
            rotate(target, direction);
 
            navi();
        }
 
 
        int sum = 0;
        for (int i = 1; i <= 4; i++) {
            sum += arr[i][0* Math.pow(2, i-1);
        }
 
        System.out.println(sum);
    }
 
    //1. 앞이 돌았냐?
    //2. 앞이 돌았다
    //2-1. 앞과 반대방향
    //
    //3. 앞이 안돌았다
    //3-1. 나도 안돈다
 
    static void rotate(int target, int direction) {
        visit[target] = true;
        flag[target] = direction;
        int left = target - 1;
        int right = target + 1;
 
        if (left >= 1 && arr[left][2!= arr[target][6&& !visit[left]) {
            rotate(left, -direction);
        }
 
        if(right <= 4 && arr[right][6!= arr[target][2&& !visit[right]){
            rotate(right, -direction);
        }
    }
 
    static void navi() {
        for (int i = 1; i < 5; i++) {
            if(flag[i] == 1) goRight(i);
            else if(flag[i] == -1) goLeft(i);
            else continue;
        }
    }
 
    static void goRight(int target) {
        int temp = arr[target][7];
        for (int i = 6; i >= 0; i--) {
            arr[target][i+1= arr[target][i];
        }
        arr[target][0= temp;
    }
 
    static void goLeft(int target) {
        int temp = arr[target][0];
        for (int i = 0; i < 7; i++) {
            arr[target][i] = arr[target][i + 1];
        }
        arr[target][7= temp;
    }
}
cs

 

코드2(하드코딩)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import java.io.*;
import java.util.*;
 
public class Main {
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
 
    static int flag[] = new int[5]; //false면 반시계 true면 시계
    static int arr[][] = new int[5][8];
    static int K;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        for (int i = 1; i <= 4; i++) {
            String s = br.readLine();
            for (int j = 0; j < 8; j++) {
                arr[i][j] = s.charAt(j) - '0';
            }
        }
 
        K = atoi(br.readLine());
 
        for (int i = 0; i < K; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int target = atoi(st.nextToken());
            int direction = atoi(st.nextToken());
 
            rotate(target, direction);
        }
 
 
        int sum = 0;
        for (int i = 1; i <= 4; i++) {
            sum += arr[i][0* Math.pow(2, i-1);
        }
 
        System.out.println(sum);
    }
 
    //1. 앞이 돌았냐?
    //2. 앞이 돌았다
    //2-1. 앞과 반대방향
    //
    //3. 앞이 안돌았다
    //3-1. 나도 안돈다
    static void rotate(int target, int direction) {
        Arrays.fill(flag, 0);
         if(target == 1){
             flag[1= direction;
             if(arr[1][2!= arr[2][6]) flag[2= -direction;
 
             if(flag[2!= 0){
                 if(arr[2][2!= arr[3][6]) flag[3= direction;
             }
 
             if(flag[3!= 0){
                 if(arr[3][2!= arr[4][6]) flag[4= -direction;
             }
         }
         else if(target == 2){
             flag[2= direction;
             if(arr[1][2!= arr[2][6]) flag[1= -direction;
             if(arr[2][2!= arr[3][6]) flag[3= -direction;
 
             if (flag[3!= 0) {
                 if(arr[3][2!= arr[4][6]) flag[4= direction;
             }
         }
         else if (target == 3) {
             flag[3= direction;
             if(arr[3][6!= arr[2][2]) flag[2= -direction;
             if(arr[3][2!= arr[4][6]) flag[4= -direction;
             if(flag[2!= 0){
                 if(arr[1][2!= arr[2][6]) flag[1= direction;
             }
         }
         else{
             flag[4= direction;
             if(arr[3][2!= arr[4][6]) flag[3= -direction;
 
             if(flag[3!= 0){
                 if(arr[2][2!= arr[3][6]) flag[2= direction;
             }
 
             if(flag[2!= 0){
                 if(arr[1][2!= arr[2][6]) flag[1= -direction;
             }
         }
 
        for (int i = 1; i < 5; i++) {
            if(flag[i] == 1) goRight(i);
            else if(flag[i] == -1) goLeft(i);
            else continue;
        }
    }
    static void goRight(int target) {
        int temp = arr[target][7];
        for (int i = 6; i >= 0; i--) {
            arr[target][i+1= arr[target][i];
        }
        arr[target][0= temp;
    }
 
    static void goLeft(int target) {
        int temp = arr[target][0];
        for (int i = 0; i < 7; i++) {
            arr[target][i] = arr[target][i + 1];
        }
        arr[target][7= temp;
    }
}
cs
728x90
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그