백준의 톱니바퀴2 (15662) 문제이다.

[ 문제 바로가기 ]


[ 문제풀이 ]

1) 톱니바퀴1과 전체적인 문제는 똑같고 톱니바퀴의 수만 더 증가한 문제이다.
   본인은 전체적인 로직 또한 톱니바퀴1과 굉장히 비슷하게 풀었다.
   단지, 톱니바퀴1에서는 바퀴가 4개뿐이라서, 4개를 하나하나 다 체크해가면서 톱니바퀴를 돌려준 반면, 이 문제에서는
   for문으로 돌려야 하는 톱니바퀴를 기준으로 왼쪽과 오른쪽으로 나눠서 돌려야 할 톱니바퀴들을
   따로 저장 후 실제로 돌려주는 과정만 더 추가해 주었다.
  
[ 소스코드 ]
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<iostream>
#include<vector>
#include<string>
 
#define endl "\n"
#define MAX 1010
using namespace std;
 
int T, K;
vector<int> V[MAX];
vector<pair<intint>> Cmd;
 
void Input()
{
    cin >> T;
    for (int i = 1; i <= T; i++)
    {
        string S; cin >> S;
        for (int j = 0; j < S.length(); j++)
        {
            V[i].push_back(S[j] - '0');
        }
    }
    cin >> K;
    for (int i = 0; i < K; i++)
    {
        int a, b; cin >> a >> b;
        Cmd.push_back(make_pair(a, b));
    }
}
 
int Reverse(int Dir)
{
    if (Dir == 1return -1;
    else return 1;
}
 
vector<pair<int,int>> Find_Turn_Wheel(int Idx, int Dir)
{
    vector<pair<intint>> R;
    R.push_back(make_pair(Idx, Dir));
    int Side1 = V[Idx].at(2);
    int Side2;
    int Cur_Dir = Dir;
 
    for (int i = Idx + 1; i <= T; i++)
    {
        Side2 = V[i].at(6);
        if (Side1 != Side2)
        {
            R.push_back(make_pair(i, Reverse(Cur_Dir)));
            Side1 = V[i].at(2);
            Cur_Dir = Reverse(Cur_Dir);
        }
        else break;
    }
 
    Side1 = V[Idx].at(6);
    Side2 = -1;
    Cur_Dir = Dir;
    for (int i = Idx - 1; i >= 1; i--)
    {
        Side2 = V[i].at(2);
        if (Side1 != Side2)
        {
            R.push_back(make_pair(i, Reverse(Cur_Dir)));
            Side1 = V[i].at(6);
            Cur_Dir = Reverse(Cur_Dir);
        }
        else break;
    }
    
    return R;
}
 
void Turning(int Idx, int Dir)
{
    if (Dir == 1)
    {
        int Temp = V[Idx].at(7);
        for (int i = 6; i >= 0; i--)
        {
            V[Idx].at(i + 1= V[Idx].at(i);
        }
        V[Idx].at(0= Temp;
    }
    else
    {
        int Temp = V[Idx].at(0);
        for (int i = 1; i <= 7; i++)
        {
            V[Idx].at(i - 1= V[Idx].at(i);
        }
        V[Idx].at(7= Temp;
    }
}
 
void Actual_Turning(vector<pair<intint>> Wheel)
{
    for (int i = 0; i < Wheel.size(); i++)
    {
        int Idx = Wheel[i].first;
        int Dir = Wheel[i].second;
        Turning(Idx, Dir);
    }
}
 
void Solution()
{
    for (int i = 0; i < K; i++)
    {
        int W_Idx = Cmd[i].first;
        int Dir = Cmd[i].second;
 
        vector<pair<intint>> Turn_Wheel;
        Turn_Wheel = Find_Turn_Wheel(W_Idx, Dir);
        Actual_Turning(Turn_Wheel);
    }
 
    int Cnt = 0;
    for (int i = 1; i <= T; i++)
    {
        if (V[i].at(0== 1) Cnt++;
    }
    cout << Cnt << endl;
}
 
void Solve()
{
    Input();
    Solution();
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
cs


+ Recent posts