※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 17144번 문제인 미세먼지 안녕!이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
문제에서 주어진 대로 잘 구현하는 문제이다.
현재 상태를 저장하는 2차원 배열과 한번의 공기청정기 작동을 임시로 저장하는 2차원 배열을 두고, 각 공기청정기의 작동을 매번 시뮬레이션하는 것으로 문제를 해결할 수 있다.
간단한 구현을 위해, cstring 헤더의 memset을 이용하여 배열 전체에 0을 채우거나, 상하좌우 움직임을 길이 4의 배열(아래의 구현에서는 dr, dc 배열)을 이용하여 구현하는 아이디어 등은 많은 문제에서 활용되니 잘 기억해두자.
공기청정기(-1)는 미세먼지가 아니므로, 답을 출력할 때 모든 칸의 합에서 2를 더하여 출력하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cstring>
using namespace std;
int arr[50][50];
int temp[50][50];
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int R, C, T; cin >> R >> C >> T;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
cin >> arr[r][c];
}
}
int U = 0, D;
while (arr[U][0] != -1) U++;
D = U + 1;
while (T--) {
memset(temp, 0, sizeof(temp));
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (arr[r][c] == -1) continue;
temp[r][c] += arr[r][c];
int dif = arr[r][c] / 5;
for (int i = 0; i < 4; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
if (arr[rr][cc] == -1) continue;
temp[rr][cc] += dif;
temp[r][c] -= dif;
}
}
}
for (int r = U - 1; r > 0; r--) arr[r][0] = temp[r - 1][0];
for (int c = 0; c < C - 1; c++) arr[0][c] = temp[0][c + 1];
for (int r = 0; r < U; r++) arr[r][C - 1] = temp[r + 1][C - 1];
for (int c = C - 1; c > 1; c--) arr[U][c] = temp[U][c - 1];
arr[U][1] = 0;
for (int r = D + 1; r < R - 1; r++) arr[r][0] = temp[r + 1][0];
for (int c = 0; c < C - 1; c++) arr[R - 1][c] = temp[R - 1][c + 1];
for (int r = R - 1; r > D; r--) arr[r][C - 1] = temp[r - 1][C - 1];
for (int c = C - 1; c > 1; c--) arr[D][c] = temp[D][c - 1];
arr[D][1] = 0;
for (int r = 1; r < U; r++) {
for (int c = 1; c < C - 1; c++) {
arr[r][c] = temp[r][c];
}
}
for (int r = D + 1; r < R - 1; r++) {
for (int c = 1; c < C - 1; c++) {
arr[r][c] = temp[r][c];
}
}
}
int ans = 0;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
ans += arr[r][c];
}
}
cout << ans + 2;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16769 // C++] Mixing Milk (0) | 2021.07.01 |
---|---|
[BOJ 2638 // C++] 치즈 (0) | 2021.06.30 |
[BOJ 6064 // C++] 카잉 달력 (0) | 2021.06.28 |
[BOJ 16928 // C++] 뱀과 사다리 게임 (0) | 2021.06.27 |
[BOJ 12852 // C++] 1로 만들기 2 (0) | 2021.06.26 |