백준문제풀이/구현

16235번-나무재테크

반응형

문제

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

 

16235번: 나무 재테크

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

www.acmicpc.net


접근방법

1) 접근 사고

그대로 구현하면 되는 문제였습니다. 저는 봄을 구현하는 과정에서 잘못된 구현으로 시간을 많이 낭비하였습니다. 양분을 먹고 새로 추가해주는 과정에서 새로운 배열에 담은 뒤에 기존 배열을 갱신해야하는데 그렇게 하지 않고 같은 배열에 두고 값을 넣어서 죽은 나무, 갱신 전에 나무의 값이 남아있어서 틀린 답이 나왔습니다. 이 부분을 제외한 계절의 구현은 정확히 구현하였습니다.

 

2) 시간 복잡도

O(n^2)

 

3) 배운 점

인구이동문제와 같은 실수를 했다. 

 

4) PS

아니 하;;;


정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include<bits/stdc++.h>
 
using namespace std;
const int MAX = 11;
 
int A[MAX][MAX];
int board[MAX][MAX];
int N, M, K;
using vi = vector<int>;
using vvi = vector<vi>;
 
int my[] = {-1,-1,-1,0,0,1,1,1};
int mx[] = {-1,0,1,-1,1,-1,0,1};
 
int main(){
    cin >> N >> M >> K;
 
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++)ㅌ
            cin >> A[i][j];
            board[i][j] = 5;
        }
    }
    vector<vvi> tree(N, vvi(N));
    for(int i =0; i < M; i++){
        int y, x, value;
        cin >> y >> x >> value;
        tree[y-1][x-1].push_back(value);
 
    }
 
    while(K--){
        //정렬
        for(int i = 0; i< N; i++){
            for(int j = 0; j < N; j++){
                sort(tree[i][j].begin(), tree[i][j].end());
            }
        }
        //봄
        vector<vvi> dT(N, vvi(N));
 
        for(int i = 0; i < N; i++){
            for(int j= 0; j < N; j++){
                vector<int> tmp;
                for(auto &t : tree[i][j]){
                    if(board[i][j] >= t){
                        board[i][j] -= t;
                        tmp.push_back(t + 1);
                    }
                    else
                       dT[i][j].push_back(t);
                }
                tree[i][j].clear();
                for(int cur : tmp)
                    tree[i][j].push_back(cur);
            }
        }
        //여름
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                for(auto &dt : dT[i][j]){
                    board[i][j] += dt / 2;
                }
            }
        }
       // cout << "braek4" <<"\n";
        //가을
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                for(auto &t : tree[i][j]){
                   if((t % 5) == 0){
                       for(int d = 0; d < 8; d++){
                           int ny = i + my[d];
                           int nx = j + mx[d];
                           if(ny >= 0 && ny < N && nx >= 0 && nx < N){
                               tree[ny][nx].push_back(1);
                           }
                       }
                   }
                }
            }
        }
       // cout << "braek" <<"\n";
        //겨울
        for(int i =0; i < N; i++){
            for(int  j = 0; j< N; j++){
                board[i][j] += A[i][j];
            }
        }
    }
 
    int cnt = 0;
    for(int i =0; i < N; i++){
        for(int j =0; j< N; j++){
            for(auto t : tree[i][j])
                cnt++;
        }
    }
    cout << cnt <<"\n";
}
cs
반응형

'백준문제풀이 > 구현' 카테고리의 다른 글

17144번-미세먼지 안녕  (0) 2021.09.14
16236번-아기상어  (0) 2021.09.14
16234번-인구이동  (0) 2021.09.13
15686번-치킨배달  (0) 2021.09.08
15685번-드래곤커브  (0) 2021.09.08