-

[삼성SW테스트] 백준 17822번 - 원판 돌리기 (정답률 31%) 본문

1-1. 삼성 SW 테스트

[삼성SW테스트] 백준 17822번 - 원판 돌리기 (정답률 31%)

asdklfjlasdlfkj 2020. 1. 16. 10:42

https://www.acmicpc.net/problem/17822

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀있고, i번째 원판에 적힌 j번째 수의 위치는 (i, j)로 표현한다. 수의 위치는 다음을 만족한다. (i, 1)은 (i, 2), (i, M)과 인접하다. (i, M)은 (i, M-1), (i, 1)과 인접하다. (i, j)는 (i, j-1), (i, j

www.acmicpc.net

2019년 하반기 삼성 SW테스트 문제다.

이 문제는 시뮬레이션을 풀듯이 풀 수도 있으며, dfs 탐색을 통해 풀 수도 있다.

어느쪽이던 편한대로 풀어도 무방할 문제인거같다.

 

   유의할 점은

1. 인접수가 없을 경우 0의 개수를 고려하지 않고 평균을 계산해 0이 아닌 숫자에만 적용을 해줘야 하는 것과

2. row/col의 범위를 잘 고려해 인접수를 구하는 것 정도가 되겠다.

 

아래는 소스코드 (C++, 4ms)

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
#include <iostream>
#include <vector>
#include <algorithm>
#define maxlen 51
using namespace std;
int N, M, T, x, d, k;
int circles[maxlen][maxlen];
bool no_adj_num = true;
vector<pair<intint> > erase, real_erase;
vector<pair<intpair<intint> > > orders;
typedef struct dir{
    int dr, dc;
}dir;
dir direction[4= { { 10 }, { -10 }, { 01 }, { 0-1 } };
void rotate(int row, int kan){
    // 시계방향 회전
    vector<int> temp(M + 10);
    for (int col = 1; col <= M; col++){
        if (col + kan > M){
            temp[col + kan - M] = circles[row][col];
        }
        else
            temp[col + kan] = circles[row][col];
    }
    for (int col = 1; col <= M; col++)
        circles[row][col] = temp[col];
    //temp.clear();
}
void dfs(int curnum, int r, int c){
    erase.push_back(make_pair(r, c));
    for (int i = 0; i < 4; i++)
    {
        int nr = r + direction[i].dr;
        int nc = c + direction[i].dc;
        if (nr >= 1 && nr <= N && nc >= 1 && nc <= M){
            if (curnum == circles[nr][nc])
                erase.push_back(make_pair(nr, nc));
        }
        else if (nr == 0){
            continue;
        }
        else if (nr > N) continue;
        else if (nc == 0){
            if (circles[nr][M] == curnum)
                erase.push_back(make_pair(nr, M));
        }
        else if (nc == M + 1){
            if (circles[nr][0== curnum)
                erase.push_back(make_pair(nr, 0));
        }
    }
    if (erase.size() > 1) {
        no_adj_num = false;
        for (int i = 0; i < erase.size(); i++){
                real_erase.push_back(erase[i]);
        }
    }
}
 
void Simulation(int th_order){
    int curx = orders[th_order].first;
    int dir = orders[th_order].second.first;
    int kan = orders[th_order].second.second;
 
    // 1. 회전.
    for (int row = 1; row <= N; row++){
        if (row % curx == 0){
            if (dir == 1){
                rotate(row, M - kan);
            }
            else
                rotate(row, kan);
        }
    }
 
    // 2-1. 인접수 확인.
    for (int r = 1; r <= N; r++){
        for (int c = 1; c <= M; c++){
            if (circles[r][c] != 0){
                dfs(circles[r][c], r, c); // 인접수 있는 경우 지우고, no_adj_num false로. 없는경우 넘어감.
            }
        }
    }
    // 2-2. 인접수 없는 경우
    if (no_adj_num){
        int sum = 0;
        int cnt = 0;
        for (int r = 1; r <= N; r++){
            for (int c = 1; c <= M; c++){
                if (circles[r][c] != 0) {
                    cnt++// 이게 문제.
                    sum += circles[r][c];
                }
            }
        }
        double average = (double)sum / (double)cnt;
        for (int r = 1; r <= N; r++){
            for (int c = 1; c <= M; c++){
                if (average > (double)circles[r][c] && circles[r][c] != 0){
                    circles[r][c]++;
                }
                else if (average < (double)circles[r][c] && circles[r][c] != 0)
                    circles[r][c]--;
            }
        }
    }
    for (int i = 0; i < real_erase.size(); i++){
        int curr = real_erase[i].first;
        int curc = real_erase[i].second;
        circles[curr][curc] = 0;
    }
    /*
    cout << '\n';
    for (int i = 1; i <= N; i++){
    for (int c = 1; c <= M; c++){
    cout << circles[i][c] << " ";
    }
    cout << '\n';
    }
    */
    no_adj_num = true;
}
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> N >> M >> T;
    for (int row = 1; row <= N; row++){
        for (int col = 1; col <= M; col++){
            cin >> circles[row][col];
        }
    }
    for (int i = 0; i < T; i++){
        cin >> x >> d >> k;
        orders.push_back(make_pair(x, make_pair(d, k)));
    }
    for (int i = 0; i < T; i++)
        Simulation(i);
    int sum = 0;
    for (int r = 1; r <= N; r++)
        for (int c = 1; c <= M; c++)
            sum += circles[r][c];
    cout << sum << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments