문제링크

 

 

15662번: 톱니바퀴 (2)

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

www.acmicpc.net

알고리즘 분류

 

시뮬레이션

 

풀이

 

백준 14891 톱니바퀴와 같은 유형의 문제로 이번 문제에선 톱니바퀴의 갯수가 정해져 있지 않다.

풀이 방법은 동일하다. 위의 태그를 참조.

 

코드

 

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[1001][8];
bool check[1001];
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);
 
    cin >> T;
    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
백준 14891번 톱니바퀴  (0) 2019.11.10
백준 14499번 주사위 굴리기  (0) 2019.11.10

+ Recent posts