ABOUT ME

-

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

    '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

    댓글

Designed by Tistory.