Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- find
- 브루트포스
- STL
- Set
- BFS
- 문자열
- C++
- Map
- 레벨3
- 코딩스킬
- 백트래킹
- 삼성
- 완전탐색
- Sort
- 백준
- substr
- 삼성SW테스트
- dfs
- 레벨2
- 프로그래머스
- KAKAO
- 코딩테스트
- 삼성SW역량테스트
- swea
- 시뮬레이션
- dp
- 모의SW역량테스트
- priority_queue
- 2018
- 이런게4문제
Archives
- Today
- Total
-
[삼성SW테스트] 백준 17822번 - 원판 돌리기 (정답률 31%) 본문
https://www.acmicpc.net/problem/17822
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<int, int> > erase, real_erase;
vector<pair<int, pair<int, int> > > orders;
typedef struct dir{
int dr, dc;
}dir;
dir direction[4] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
void rotate(int row, int kan){
// 시계방향 회전
vector<int> temp(M + 1, 0);
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];
}
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;
// 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 |
'1-1. 삼성 SW 테스트' 카테고리의 다른 글
[삼성SW테스트] 백준 17837번 - 새로운 게임 2 (정답률 46%) (0) | 2020.01.19 |
---|---|
[삼성SW테스트] 백준 17779번 - 게리맨더링 2 (정답률 58%) (0) | 2020.01.16 |
[삼성SW테스트] 백준 17825번 - 주사위 윷놀이 (정답률 30%) (0) | 2020.01.15 |
[삼성SW테스트] 백준 13460번 - 구슬 탈출 2 (정답률 24%) (0) | 2020.01.15 |
[삼성SW테스트] 백준 12100번 - 2048 (Easy) (정답률 23%) (0) | 2020.01.15 |
Comments