Memo
어려웠던 점
•
미세먼지가 확산될 때 기존의 배열에서 해결 가능하지 않다는 사실을 예제를 보고 파악할 수 밖에 없었던 점.
•
공기청정기가 작동할 때 인덱스 안에 값들을 한 칸씩 미는 것에 대한 어려움
아쉬웠던 점
•
size_t
→ for (size_t i = 10 ; i ≥ 0 ; i—) 는 원하는 결과를 불러오지 못할 수 있음. (hint. unsigned)
Code
제출 날짜
@3/3/2021
메모리
2152KB
시간
48ms
#include <iostream>
#include <algorithm>
#include <vector>
std::vector<std::vector<int> >A;
std::vector<std::vector<int> >A_cp;
std::vector<std::pair<int, int> >air_cond_coor;
std::vector<std::pair<int, int> >dir;
size_t R, C, T;
int ans;
void input_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
input_faster();
std::cin >> R >> C >> T;
A.resize(R, std::vector<int>(C));
A_cp.resize(R, std::vector<int>(C));
for (size_t i = 0 ; i < R ; i++)
for (size_t j = 0 ; j < C ; j++)
{
std::cin >> A[i][j];
if (A[i][j] == -1)
air_cond_coor.push_back({i, j});
}
dir = {{0, 1}, {1, 0} , {0, -1}, {-1, 0}};
}
void cal_ans()
{
ans = 0;
for (size_t i = 0 ; i < R ; i++)
{
for (size_t j = 0 ; j < C ; j++)
{
ans += A[i][j];
}
}
}
void f_air_operation()
{
//up
int tmp1, tmp2;
int y = air_cond_coor[0].first;
int x = air_cond_coor[0].second;
tmp2 = A[y][1];
A[y][1] = 0;
for (int j = 2 ; j < C; j++)
{
tmp1 = A[y][j];
A[y][j] = tmp2;
tmp2 = tmp1;
}
for (int i = y - 1 ; i >= 0 ; i--)
{
tmp1 = A[i][C - 1];
A[i][C - 1] = tmp2;
tmp2 = tmp1;
}
for (int j = C - 2 ; j >= 0 ; j--)
{
tmp1 = A[0][j];
A[0][j] = tmp2;
tmp2 = tmp1;
}
for (int i = 1 ; i < y; i++)
{
tmp1 = A[i][0];
A[i][0] = tmp2;
tmp2 = tmp1;
}
//down
y = air_cond_coor[1].first;
x = air_cond_coor[1].second;
tmp2 = A[y][1];
A[y][1] = 0;
for (int j = 2 ; j < C; j++)
{
tmp1 = A[y][j];
A[y][j] = tmp2;
tmp2 = tmp1;
}
for (int i = y + 1; i <= R - 1; i++)
{
tmp1 = A[i][C - 1];
A[i][C - 1] = tmp2;
tmp2 = tmp1;
}
for (int j = C - 2 ; j >= 0 ; j--)
{
tmp1 = A[R - 1][j];
A[R - 1][j] = tmp2;
tmp2 = tmp1;
}
for (int i = R - 2 ; i > y ; i--)
{
tmp1 = A[i][0];
A[i][0] = tmp2;
tmp2 = tmp1;
}
}
void f_fine_dust_diffusion()
{
int diffusion_cnt;
for (size_t i = 0 ; i < R ; i++)
std::fill(A_cp[i].begin(), A_cp[i].end(), 0);
for (size_t i = 0 ; i < R ; i++)
{
for (size_t j = 0 ; j < C ; j++)
{
diffusion_cnt = 0;
for (size_t k = 0 ; k < 4 ; k++)
{
int y = i + dir[k].first;
int x = j + dir[k].second;
if (y < 0 || y >= R || x < 0 || x >= C)
continue;
if (A[y][x] == -1)
continue;
diffusion_cnt++;
A_cp[y][x] += (A[i][j] / 5);
}
A_cp[i][j] += (A[i][j] - (A[i][j] / 5) * diffusion_cnt);
}
}
for (size_t i = 0 ; i < R ; i++)
std::fill(A[i].begin(), A[i].end(), 0);
for (size_t i = 0 ; i < R ; i++)
for (size_t j = 0 ; j < C ; j++)
A[i][j] = A_cp[i][j];
for (size_t i = 0 ; i < 2 ; i++)
A[air_cond_coor[i].first][air_cond_coor[i].second] = -1;
}
void solve()
{
while (T--)
{
f_fine_dust_diffusion();
f_air_operation();
}
}
void print_val()
{
std::cout <<ans + 2;
}
int main()
{
input();
solve();
cal_ans();
print_val();
return (0);
}
C++
복사