본문 바로가기

BOJ/C++

[BOJ] 17822. 원판 돌리기

* rotate에서는 x의 배수인 원판들을 시계/반시계 방향으로 k번 회전한다. 

* deque를 사용해서 시계방향은 한 원판에서 가장 뒤에 있는 요소를 가장 앞에 삽입한다. (pop_back -> push_front)

반시계방향은 가장 앞에 있는 요소를 가장 뒤에 삽입한다. (pop_front->push_back)

* deque에 저장된 값들을 다시 map에 넣는다. 

* removeNums()에서는 인접한 숫자들을 지운다. 만약, 전체 원판을 통틀어 지울 수가 없다면 평균값에 따라 원판의 값을 조절한다. 

* 각 좌표에서 상 하 좌 우를 살펴봤을 때 같은 수가 있으면 큐에 넣어준다. 만약, 전체 원판을 봤을 때 큐에 아무런 값도 없다면 지울 값이 없다는 것이다. 

* *평균값을 double로 구해줘야 한다. * *

* 지워진 숫자들은 -1로 표시해준다. 

 

 

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include <vector>
#include <deque>
#include <cstring>
#include <queue>
using namespace std;
 
int n, m, t;
int map[51][51];
bool deleted[51][51];
bool flag[51];
int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};
typedef pair<int, int> pp;
 
void print(int x)
{
    for (int j = 1; j <= m; j++)
    {
        if (map[x][j] == -1)
            cout << 'x' << ' ';
        else
        {
            cout << map[x][j] << ' ';
        }
    }
}
void removeNums()
{
    //인접한 숫자들을 지운다.
    queue<pp> q;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (map[i][j] == -1) continue;
 
            bool flag = false;
            for (int d = 0; d < 4; d++)
            {
                int nx = i + dx[d];
                int ny = j + dy[d];
 
                if (nx < 1 || nx > n || ny < 1 || ny > m)
                    continue;
 
                if (map[i][j] == map[nx][ny])
                {
                    flag = true;
                    q.push(pp(nx, ny));
                }
            }
            if (j == 1 && map[i][1] == map[i][m]) {
                flag=  true;
                q.push(pp(i, m));
            }
            if (flag)
                q.push(pp(i, j));
        }
    }
    if (q.empty())
    {
        int sum = 0, cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (map[i][j] == -1)
                    continue;
                sum += map[i][j];
                cnt++;
            }
        }
        double avg = (double)((double)sum / (double)cnt);
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (map[i][j] == -1)
                    continue;
                if (map[i][j] < avg) map[i][j]++;
                else if (map[i][j] > avg) map[i][j]--;
            }
        }
    }
    else
    {
        while (!q.empty())
        {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
 
            map[x][y] = -1;
        }
    }
}
void rotate(int x, int d, int k)
{
    deque<int> dq;
    for (int i = x; i <= n; i++)
    {
        if (i % x == 0)
        {
            for (int j = 1; j <= m; j++)
                dq.push_back(map[i][j]);
            //x의 배수인 원판
            if (d == 0)
            {
                //시계방향
                int cnt = k;
                while (cnt--)
                {
                    dq.push_front(dq.back());
                    dq.pop_back();
                }
            }
            else
            {
                int cnt = k;
                while (cnt--)
                {
                    dq.push_back(dq.front());
                    dq.pop_front();
                }
            }
            int idx = 1;
            while (!dq.empty())
            {
                map[i][idx++] = dq.front();
                dq.pop_front();
            }
        }
    }
     
    removeNums();
     
}
int main()
{
 
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> n >> m >> t;
 
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> map[i][j];
        }
    }
 
    while (t--)
    {
        int x, d, k;
        cin >> x >> d >> k;
        rotate(x, d, k);
    }
 
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (map[i][j] == -1)
                continue;
            sum += map[i][j];
        }
    }
    cout << sum << '\n';
    return 0;
}

'BOJ > C++' 카테고리의 다른 글

[BOJ] 16939. 2X2X2 큐브  (0) 2020.04.20
[BOJ] 16932. 모양 만들기  (0) 2020.04.20
[BOJ] 16918. 봄버맨  (0) 2020.04.17
[BOJ] 9328. 열쇠  (0) 2020.04.16
[BOJ] 14391. 종이조각  (0) 2020.04.16