쩡류 2021. 11. 18. 17:22
728x90

https://www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터

www.acmicpc.net

 

- 단순 구현 문제이다. 특이점으로는 for loop이 여러개가 중첩된다. 따라서, 집중해서 잘 코드를 구현하는게 중요하다.

또한, 하나의 1x1 구역에 여러 개의 나무가 심어질 수 있다는 것에 유의한다. 이걸 C로는 어떻게 구현을 하는지는 모르겠지만, C++에는 vector라는 무기가 있기 때문에 2차원 vector 배열을 선언해서 각 영역에 존재하는 나무의 나이를 push 해 주면 된다. 왜냐하면 추후 계산에는 나무의 나이만 활용이 되기 때문이다.

 

- 봄에 양분을 먹을 때에는, 나무를 먼저 sort하여 오름차순 정렬을 한다. 그래서 양분을 먹을 수 있는 작은 나무부터 양분을 먹이고, 만약 특정 나무가 불가능하다면 그 뒤에있는 나무들 또한 다 죽어야 하므로 모두 벡터에서 pop_back을 해준다. 그 과정에서 해당 나무의 나이 / 2 를 따로 저장해서 여름에 먹일 양분으로 기록한다.

 

- 가을 또한 특이사항이 없다. 상하좌우 뿐 아니라 대각선으로도 뻗어나간다는점만 신경을 쓰면 된다. 겨울도 마찬가지로 양분을 추가 해 주면 끝이다.

 

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int ground[11][11], added[11][11], dead[11][11];
int dx[] = { 0,0,1,-1,-1,-1,1,1 };
int dy[] = { -1,1,0,0,-1,1,-1,1 };

vector<int> v[11][11];

int main() {
	int n, m, k;
	int answer = 0;
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> added[i][j];
			ground[i][j] = 5;
		}
	}
	while (m--) {
		int x, y, z;
		cin >> x >> y >> z;
		v[x][y].push_back(z);
	}
	while (k--) {
		//봄
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				sort(v[i][j].begin(), v[i][j].end());
				for (int k = 0; k < v[i][j].size(); k++) {
					if (ground[i][j] >= v[i][j][k]) {
						ground[i][j] -= v[i][j][k];
						v[i][j][k]++;
					}
					else {
						for (int l = v[i][j].size() - 1; l >= k ; l--) {
							dead[i][j] += (v[i][j][l] / 2);
							v[i][j].pop_back();
						}
						break;
					}
				}
			}
		}
		//여름
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				ground[i][j] += dead[i][j];
				dead[i][j] = 0;
			}
		}
		// 가을
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				for (int k = 0; k < v[i][j].size(); k++) {
					if (v[i][j][k] % 5 == 0){
						for (int l = 0; l < 8; l++) {
							int nx = i + dx[l];
							int ny = j + dy[l];
							if (nx < 1 || nx > n || ny < 1 || ny > n) continue;
							v[nx][ny].push_back(1);
						}
					}
				}
			}
		}
		// 겨울
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				ground[i][j] += added[i][j];
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			answer += v[i][j].size();
		}
	}
	cout << answer;
	return 0;
}