백준 온라인 저지/Gold

[BOJ] 14891 - 톱니바퀴

jooona 2021. 4. 11. 18:32
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

난이도: 골드 5

사용언어: JAVA

 

풀이

비교적 간단한 구현 문제입니다. 저는 재귀를 이용해 각 톱니바퀴에서 오른쪽부터 모두 검사하고, 그 뒤에 왼쪽을 모두 검사하여 회전시켜야 할 톱니바퀴들만 마지막에 일괄적으로 회전시켜주는 형식으로 문제를 해결했습니다.

 

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
import java.io.*;
import java.util.*;
 
class Main {
 
    static int arr[][] = new int[5][8];
 
    public static void gear_right(int n, int m) { // 오른쪽 톱니바퀴만 검사
        if (n == 4) { // 4번 톱니바퀴면 더이상 확인할 필요 x
 
        } else {
            if (arr[n][2!= arr[n + 1][6]) { // 오른쪽 톱니바퀴와 극이 다르면
                m = (m == 1) ? -1 : 1// 회전 방향 바꿔주기
                gear_right(n + 1, m); // 재귀를 통한 다음 톱니바퀴 확인
                turn(n + 1, m); // 모든 확인이 끝난 뒤 회전 수행
            }
        }
    }
 
    public static void gear_left(int n, int m) { // 왼쪽 톱니바퀴만 검사
        if (n == 1) { // 1번 톱니바퀴면 더이상 확인할 필요 x
 
        } else {
            if (arr[n][6!= arr[n - 1][2]) { // 왼쪽 톱니바퀴와 극이 다르면
                m = (m == 1) ? -1 : 1;
                gear_left(n - 1, m);
                turn(n - 1, m);
            }
        }
    }
 
    public static void turn(int n, int m) { // 톱니바퀴 회전 시키기
        if (m == 1) { // 시계방향으로 회전
            int temp = arr[n][7];
            for (int i = 6; i >= 0; i--) {
                arr[n][i + 1= arr[n][i];
            }
            arr[n][0= temp;
        } else { // 반시계방향으로 회전
            int temp = arr[n][0];
            for (int i = 1; i < 8; i++) {
                arr[n][i - 1= arr[n][i];
            }
            arr[n][7= temp;
        }
    }
 
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String s;
        StringTokenizer st;
        int K;
 
        for (int i = 1; i <= 4; i++) {
            s = br.readLine();
            for (int j = 0; j < 8; j++) {
                arr[i][j] = s.charAt(j) - '0';
            }
        }
 
        K = Integer.parseInt(br.readLine());
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
 
            if (n == 1) { // 1번 톱니바퀴는 오른쪽만 검사하면 됨
                gear_right(n, m);
                turn(n, m);
            } else if (n == 4) { // 4번 톱니바퀴는 왼쪽만 검사하면 됨
                gear_left(n, m);
                turn(n, m);
            } else {
                gear_right(n, m);
                gear_left(n, m);
                turn(n, m);
            }
        }
 
        int sum = 0;
        sum += arr[1][0+ arr[2][0* 2 + arr[3][0* 4 + arr[4][0* 8;
        bw.write(String.valueOf(sum) + "\n");
        bw.flush();
        bw.close();
        br.close();
    }
}
cs

 

반응형