SDJ( 수돈재 아님 ㅎ )

[C++] 14891 - 톱니바퀴 본문

알고리즘/Backjoon

[C++] 14891 - 톱니바퀴

ShinDongJun 2020. 1. 13. 16:27

문제 링크 : https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

 

 

 

구현에 있어서 함수 s()를 재귀로 호출해서 하려했으나 예외처리를 하는데 마땅히 좋은 아이디어가 떠오르지 않아서 하드코딩했다,,

 

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
#include<iostream>
#include<algorithm>
#include<string>
 
#define CLOCKWISE 1
#define COUNTERCLOCKWISE -1
 
using namespace std;
 
char S[4][9];
 
void shift(int idx, int mode);
void s(int idx, int mode);
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    for(int i = 0; i < 4++i)
        cin >> S[i];
 
    int t;
    int idx, mode;
    cin >> t;
    while(t--)
    {
        cin >> idx >> mode;
        s(idx-1, mode);
    }
 
    int score = 0;
    for(int i = 0;i < 4++i)
        score += (S[i][0== '0' ? 0 : 1 << i);
    
    cout << score << endl;
 
    return 0;
}
 
void shift(int idx, int mode)
{
    int tmp;
    if(mode == CLOCKWISE)
    {
        tmp = S[idx][7];
        for(int i = 7; i >= 0--i)
            S[idx][i] = S[idx][i-1];
        S[idx][0= tmp;
    }
    else if(mode == COUNTERCLOCKWISE)
    {
        tmp = S[idx][0];
        for(int i = 0; i < 7++i)
            S[idx][i] = S[idx][i+1];
        S[idx][7= tmp;
    }
}
 
void s(int idx, int mode)
{
    if(idx == 0)
    {
        if(S[idx][2!= S[idx+1][6])
        {
            if(S[idx+1][2!= S[idx+2][6])
            {
                if(S[idx+2][2!= S[idx+3][6])
                {
                    shift(idx+3, mode*-1);
                }
                shift(idx+2, mode);
            }
            shift(idx+1, mode*-1);
        }
    }
    else if(idx == 1)
    {
        if(S[idx][6!= S[idx-1][2])
            shift(idx-1, mode*-1);
        if(S[idx][2!= S[idx+1][6])
        {
            if(S[idx+1][2!= S[idx+2][6])
            {
                shift(idx+2, mode);
            }    
            shift(idx+1, mode*-1);
        }
    }
    else if(idx == 2)
    {
        if(S[idx][6!= S[idx-1][2])
        {
            if(S[idx-1][6!= S[idx-2][2])
            {
                shift(idx-2, mode);
            }
            shift(idx-1, mode*-1);
        }
        if(S[idx][2!= S[idx+1][6])
            shift(idx+1, mode*-1);
    }
    else if(idx == 3)
    {
        if(S[idx][6!= S[idx-1][2])
        {
            if(S[idx-1][6!= S[idx-2][2])
            {
                if(S[idx-2][6!= S[idx-3][2])
                {
                    shift(idx-3, mode*-1);
                }
                shift(idx-2, mode);
            }
            shift(idx-1, mode*-1);
        }
    }
 
    shift(idx, mode);
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[C++] 2688 - 줄어들지 않아  (0) 2020.01.13
[C++] 17478 - 재귀함수가 뭔가요?  (0) 2020.01.13
[C++] 2170 - 선 긋기  (0) 2020.01.12
[C++] 10845 - 큐  (0) 2020.01.12
[C++] 6549 - 히스토그램에서 가장 큰 직사각형  (0) 2020.01.12
Comments