17144번: 미세먼지 안녕!

Memo


어려웠던 점

아쉬웠던 점

→ for (size_t i = 10 ; i ≥ 0 ; i—) 는 원하는 결과를 불러오지 못할 수 있음. (hint. unsigned)

Code


제출 날짜

2021/03/03

메모리

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);
}