[백준 17144번 C/C++] 미세먼지 안녕!
[백준 17144번 C/C++] 미세먼지 안녕!
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
해결전략
브루트포스 Brute Force, 구현
정답코드
#include <iostream>
#include <vector>
using namespace std;
int dirY[4] = { -1, 0, 1, 0 };
int dirX[4] = { 0, -1, 0, 1 };
int r, c, t;
vector<vector<int>> v;
int airLocY, airLocX;
void Spread(int y, int x, vector<vector<int>>& arr)
{
if (y < 0 || r <= y || x < 0 || c <= x) return;
int temp = 0;
for (int i = 0; i < 4; i++) {
int ny = y + dirY[i];
int nx = x + dirX[i];
if (ny < 0 || r <= ny || nx < 0 || c <= nx) continue;
if (v[ny][nx] == -1) continue;
v[ny][nx] += arr[y][x] / 5;
temp += arr[y][x] / 5;
}
v[y][x] -= temp;
}
void AirPurifier(int airy, int airx)
{
vector<vector<int>> temp(r, vector<int>(c, 0));
temp = v;
//공기청정기 윗 부분 (반시계 방향 순환)
for (int i = 1; i < c; i++)
temp[airy][i] = v[airy][i - 1];
for (int i = airy - 1; i >= 0; i--)
temp[i][c - 1] = v[i + 1][c - 1];
for (int i = c - 2; i >= 0; i--)
temp[0][i] = v[0][i + 1];
for (int i = 1; i < airy; i++)
temp[i][0] = v[i - 1][0];
//공기청정기 아랫 부분 (시계 방향 순환)
for (int i = 1; i < c; i++)
temp[airy + 1][i] = v[airy + 1][i - 1];
for (int i = airy + 2; i < r; i++)
temp[i][c - 1] = v[i - 1][c - 1];
for (int i = c - 2; i >= 0; i--)
temp[r - 1][i] = v[r - 1][i + 1];
for (int i = r - 2; i > airy + 1; i--)
temp[i][0] = v[i + 1][0];
temp[airy][1] = 0;
temp[airy + 1][1] = 0;
temp[airy][0] = -1;
temp[airy + 1][0] = -1;
v = temp;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> r >> c >> t;
v.resize(r, vector<int>(c));
for (int y = 0; y < r; y++) {
for (int x = 0; x < c; x++) {
cin >> v[y][x];
if (v[y][x] == -1) {
airLocY = y - 1;
airLocX = x;
}
}
}
while (t--)
{
vector<vector<int>> tmp(r, vector<int>(c));
tmp = v;
for (int y = 0; y < r; y++) {
for (int x = 0; x < c; x++) {
if (tmp[y][x] != 0)
{
Spread(y, x, tmp);
}
}
}
AirPurifier(airLocY, airLocX);
}
int answer = 0;
for (int y = 0; y < r; y++) {
for (int x = 0; x < c; x++) {
answer += v[y][x];
}
}
cout << answer + 2;
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2448번 C/C++] 별 찍기 - 11 (1) | 2024.01.09 |
---|---|
[백준 12851번 C/C++] 숨바꼭질2 (0) | 2024.01.08 |
[백준 2096번 C/C++] 내려가기 (1) | 2024.01.04 |
[백준 15486번 C/C++] 퇴사2 (1) | 2024.01.03 |
[백준 9935번 C/C++] 문자열 폭발 (0) | 2024.01.02 |
댓글
이 글 공유하기
다른 글
-
[백준 2448번 C/C++] 별 찍기 - 11
[백준 2448번 C/C++] 별 찍기 - 11
2024.01.09 -
[백준 12851번 C/C++] 숨바꼭질2
[백준 12851번 C/C++] 숨바꼭질2
2024.01.08 -
[백준 2096번 C/C++] 내려가기
[백준 2096번 C/C++] 내려가기
2024.01.04 -
[백준 15486번 C/C++] 퇴사2
[백준 15486번 C/C++] 퇴사2
2024.01.03