Algorithm/구현(Brute force, Back tracking, etc.)
백준 16235 나무 재테크
쩡류
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;
}