-
백준 16235 나무 재테크Algorithm/구현(Brute force, Back tracking, etc.) 2021. 11. 18. 17:22728x90
https://www.acmicpc.net/problem/16235
- 단순 구현 문제이다. 특이점으로는 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; }
'Algorithm > 구현(Brute force, Back tracking, etc.)' 카테고리의 다른 글
백준 17144 미세먼지 안녕! (0) 2021.11.19 백준 16236 아기 상어 (0) 2021.11.19 백준 16234 인구 이동 (0) 2021.11.18 백준 15686 치킨 배달 (0) 2021.11.18 백준 15685 드래곤커브 (0) 2021.11.17