알고리즘/백준

[백준 16235] 나무 재테크 C++

겜도리도리 2021. 12. 1. 22:26
반응형

문제

백준 16235 나무 재테크 C++

 

16235번: 나무 재테크

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

www.acmicpc.net

풀이

가장 싫어하는 부류인 빡구현 문제입니다,,,

주어진 조건대로 차근차근 구현하였습니다.

소스 코드

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
 
int dx[] = { -101-11-101 };
int dy[] = { -1-1-100111 };
// 나무 정보 : 나이, 생존 여부
struct Tree
{
    int age = 1;
    bool alive = 1;
};
 
// 나무 정렬할 때 나이 기준 오름차순 정렬
bool cmp(const Tree& a, const Tree& b)
{
    if (a.age < b.age) return true;
    return false;
}
 
// 맵 정보 : (y, x)에 있는 영양분, 나무
struct Map
{
    int nutrient = 5;
    vector<Tree> tree;
};
 
int A[10][10];
Map map[10][10];
int N, M, K;
 
// 나무 나이 오름차순으로 정렬하는 함수
void SortTree(int x, int y) {
    sort(map[y][x].tree.begin(), map[y][x].tree.end(), cmp);
}
 
// 봄 : 양분 먹고 나이 증가
void Spring() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            // 나이순으로 정렬
            SortTree(j, i);
            for (int k = 0; k < map[i][j].tree.size(); k++) {
                // 양분 먹을 수 있으면 성장
                if (map[i][j].nutrient >= map[i][j].tree[k].age) {
                    map[i][j].nutrient -= map[i][j].tree[k].age;
                    map[i][j].tree[k].age++;
                }
                // 아니면 죽음
                else {
                    map[i][j].tree[k].alive = false;
                }
            }
        }
    }
}
 
// 여름 : 죽은 나무 영양분으로 전환
void Summer() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            while (1) {
                int idx = map[i][j].tree.size() - 1;
                // 나무 죽었으면
                if (idx >= 0 && !map[i][j].tree[idx].alive) {
                    map[i][j].nutrient += map[i][j].tree[idx].age / 2;
                    map[i][j].tree.pop_back();
                }
                else {
                    break;
                }
            }
        }
    }
}
 
 
// 가을 : 나무 번식
void Autumn() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            for (int k = 0; k < map[i][j].tree.size(); k++) {
                // 나이 5의 배수이면
                if ((map[i][j].tree[k].age % 5== 0) {
                    for (int q = 0; q < 8; q++) {
                        int nx = j + dx[q];
                        int ny = i + dy[q];
                        if (nx >= 0 && ny >= 0 && nx < N && ny < N) {
                            // 범위 안이면 나이가 1인 나무 생성
                            map[ny][nx].tree.push_back({ 11 });
                        }
                    }
                }
            }
        }
    }
}
 
// 겨울 : 양분 추가
void Winter() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            map[i][j].nutrient += A[i][j];
        }
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> N >> M >> K;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++) {
            cin >> A[i][j];
        }
    }
    for (int i = 0; i < M; i++) {
        int y, x, z;
        cin >> y >> x >> z;
        y--;
        x--;
        map[y][x].tree.push_back({ z, true });
    }
    // K년 만큼 사계절 반복
    while (K--) {
        Spring();
        Summer();
        Autumn();
        Winter();
    }
    int ans = 0;
    // 살아 있는 나무 개수 세기
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            for (int k = 0; k < map[i][j].tree.size(); k++) {
                if (map[i][j].tree[k].alive) {
                    ans++;
                }
            }
        }
    }
    cout << ans;
    return 0;
}
cs
반응형