※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts