Search
Duplicate

미세먼지 안녕!

주차
0주차
문제번호
17144
언어
티어
골드
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

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++
복사