문제 링크

 

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다. 톱니바퀴를 회전시키려

www.acmicpc.net

 

알고리즘 분류

 

시뮬레이션

 

풀이

 

맞닿은 극이 서로 다른 경우의 회전을 하게 되는 경우 맞닿은 톱니바퀴에서 다시 회전이 일어나게 되는데 재귀함수를 통해 문제를 해결했습니다.

톱니바퀴를 왼쪽 끝, 오른쪽 끝, 나머지 세 가지의 경우로 나누어 함수를 설계하였고, 맞닿은 부분이 서로 다른 극일 때 회전 방향을 반대로 하여 재귀호출 해주었습니다. 이미 회전이 일어난 톱니바퀴가 다시 호출되는 일을 막기 위해

check배열을 사용하여 이미 회전이 일어난 톱니바퀴를 체크해주었습니다.

 

코드

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
#include <iostream>
#include <string.h>
 
using namespace std;
 
int gear[5][8];
bool check[5];
int T;
 
void spin(int n, int d)
{
    check[n] = true;
 
    if (T != 1)
    {
        if (n == 1// 왼쪽 끝 톱니바퀴
        {
            if (!check[2]) // 오른쪽의 톱니만 검사
            {
                if (gear[1][2!= gear[2][6])
                    spin(2-d);
            }
        }
        else if (n == T) // 오른쪽 끝 톱니바퀴
        {
            if (!check[T - 1]) // 왼쪽의 톱니만 검사
            {
                if (gear[T - 1][2!= gear[T][6])
                    spin(T - 1-d);
            }
        }
        else // 중간 톱니바퀴들
        {
            if (!check[n - 1])
            {
                if (gear[n - 1][2!= gear[n][6])
                    spin(n - 1-d);
            }
            if (!check[n + 1])
            {
                if (gear[n][2!= gear[n + 1][6])
                    spin(n + 1-d);
            }
        }
    }
 
    if (d == 1// 시계 방향
    {
        int temp = gear[n][7];
 
        for (int i = 7; i >= 1; i--)
        {
            gear[n][i] = gear[n][i - 1];
        }
        gear[n][0= temp;
    }
 
    if (d == -1// 반시계 방향
    {
        int temp = gear[n][0];
 
        for (int i = 0; i < 7; i++)
        {
            gear[n][i] = gear[n][i + 1];
        }
        gear[n][7= temp;
    }
}
int main()
{
    //freopen("input.txt", "r", stdin);
    //setbuf(stdout, NULL);
 
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    T = 4// 톱니바퀴 4개
 
    for (int i = 1; i <= T; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            scanf(" %1d"&gear[i][j]);
        }
    }
 
    int k;
 
    cin >> k;
 
    for (int i = 0; i < k; i++)
    {
        memset(check, 0sizeof(check));
        int a, b;
        cin >> a >> b;
 
        spin(a, b);
    }
 
    int ans = 0;
    for (int i = 1; i <= T; i++)
    {
        if (gear[i][0== 1)
        {
            ans++;
        }
    }
    printf("%d", ans);
}

'Algorithm > boj' 카테고리의 다른 글

백준 2110번 공유기 설치  (1) 2021.10.24
백준 14890번 경사로  (0) 2019.11.11
백준 14503 로봇 청소기  (0) 2019.11.11
백준 15662번 톱니바퀴 (2)  (0) 2019.11.10
백준 14499번 주사위 굴리기  (0) 2019.11.10

+ Recent posts