시뮬레이션
삼성 SW 기출
1. 문제 해결 아이디어
낚시왕 문제와 느낌이 비슷했다.
시뮬레이션 문제는 문제에 어떻게 구현해야 하는지 자세히 나와있어서 풀이라고 할 게 없다.
1. 미세먼지를 확산시키고
2. 공기청정기를 작동시킨다.
우선 미세먼지를 확산시키기 위해서 현재 맵에있는 먼지들을 임의의 벡터에 추가해준다.
그리고 벡터에서 먼지를 하나씩 꺼내면서 주위에 미세먼지량/5 만큼 퍼뜨려 준다.
모두 퍼뜨렸다면 공기청정기를 가동해야한다.
처음에 공기청정기가 항상 1열에 있다는 문구를 못 보고 정말 복잡하게 코드를 짰었다..
문제를 잘 읽자!ㅠ
공기청정기가 항상 1열에 있기 때문에 공기 흐름의 반대 방향으로 for문을 돌리면서 맵에 있는 먼지를 이동시켜준다.
마지막에 공기청정기의 -1 값을 이동시켜주게 되는데 이때만 다시 0으로 바꿔주면 끝이다.!
2. 코드
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
|
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 1e9+7
#define pii pair<int, int>
typedef long long ll;
// typedef pair<int, int> pii;
using namespace std;
struct Dust{
int r, c, d;
};
int R, C, T;
int Map[51][51];
int dr[4] = {0, 0, 1, -1};
int dc[4] = {1, -1, 0, 0};
vector<Dust> Microdust;
vector<pii > Aircleaner;
void input(){
cin >> R >> C >> T;
for(int r = 0; r < R; r++){
for(int c = 0; c < C; c++){
cin >> Map[r][c];
if(Map[r][c] == -1){
Aircleaner.push_back({r, c});
}
}
}
}
void ready_to_spread(){
Microdust.clear();
for(int r = 0; r < R; r++){
for(int c = 0; c < C; c++){
if(Map[r][c] > 0){
Microdust.push_back({r, c, Map[r][c]});
Map[r][c] = 0;
}
}
}
}
void Spread_Dust(){
for(auto &dust : Microdust){
int cnt = 0;
int div = dust.d/5;
for(int k = 0; k < 4; k++){
int nr = dust.r + dr[k];
int nc = dust.c + dc[k];
if(nr < 0 || nr >= R || nc < 0 || nc >= C || Map[nr][nc] == -1) continue;
cnt++;
Map[nr][nc] += div;
}
dust.d -= (cnt * div);
Map[dust.r][dust.c] += dust.d;
}
}
void Cleaning(){
int tr = Aircleaner[0].first;
int br = Aircleaner[1].first;
// 위쪽 청정기
for(int r = tr-1; r >= 1; r--){
Map[r][0] = Map[r-1][0];
}
for(int c = 0; c < C-1; c++){
Map[0][c] = Map[0][c+1];
}
for(int r = 0; r < tr; r++){
Map[r][C-1] = Map[r+1][C-1];
}
for(int c = C-1; c >= 1; c--){
Map[tr][c] = Map[tr][c-1];
if(Map[tr][c] == -1) Map[tr][c] = 0;
}
// 아래쪽 청정기
for(int r = br+1; r < R-1; r++){
Map[r][0] = Map[r+1][0];
}
for(int c = 0; c < C-1; c++){
Map[R-1][c] = Map[R-1][c+1];
}
for(int r = R-1; r > br; r--){
Map[r][C-1] = Map[r-1][C-1];
}
for(int c = C-1; c >= 1; c--){
Map[br][c] = Map[br][c-1];
if(Map[br][c] == -1) Map[br][c] = 0;
}
}
int Dust_Amount(){
int dust = 0;
for(int r = 0; r < R; r++){
for(int c = 0; c < C; c++){
if(Map[r][c] > 0) dust += Map[r][c];
}
}
return dust;
}
void solve(){
while(T--){
ready_to_spread();
Spread_Dust();
Cleaning();
}
cout << Dust_Amount();
}
int main(){
fasti
input();
solve();
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 2458] 키 순서 C++ (0) | 2021.07.14 |
---|---|
[백준 15684] 사다리 조작 C++ (1) | 2021.07.12 |
[백준 1613] 역사 C++ (0) | 2021.07.12 |
[백준 17143] 낚시왕 C++ (0) | 2021.07.11 |
[백준 11779] 최소 비용 구하기 2 C++ (0) | 2021.07.09 |