최's 먹공로그
BOJ16235_나무 재테크 본문
https://www.acmicpc.net/problem/16235
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static class tree {
int r;
int c;
int age;
public tree(int r, int c, int age) {
this.r = r;
this.c = c;
this.age = age;
}
}
private static int N;
private static int M;
private static int K;
private static int[][] ground;
private static int[][] A;
private static List<tree> list;
private static List<tree> dead_list;
private static List<Integer> delete_list;
private static int[] dr = {-1,-1,-1,0,0,1,1,1};
private static int[] dc = {-1,0,1,-1,1,-1,0,1};
public static void main(String[] args) throws Exception {
// *************입력 시작****************
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
N = Integer.parseInt(st.nextToken()); // 땅크기
M = Integer.parseInt(st.nextToken()); // 나무 몇그루?
K = Integer.parseInt(st.nextToken()); // 몇년?
ground = new int[N + 1][N + 1]; // 땅의 양분상태 저장 배열 , 계속 변함
A = new int[N + 1][N + 1]; // 각 땅에 공급해주는 양분 정보
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine().trim(), " ");
for (int j = 1; j <= N; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
list = new ArrayList<>();
dead_list = new ArrayList<>();
delete_list = new ArrayList<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int tree_r = Integer.parseInt(st.nextToken());
int tree_c = Integer.parseInt(st.nextToken());
int tree_age = Integer.parseInt(st.nextToken());
list.add(new tree(tree_r, tree_c, tree_age));
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
ground[i][j] = 5;
}
}
// **************입력 끝****************
for (int i = 0; i < K; i++) {
// 하나의 칸에 여러개의 나무 있을 경우 어린 나무부터 양분을 먹는 경우를 위해 현재 나무가 담긴 list를 sort해준다
tree_sort();
spring();
if (dead_list.size() >= 1) {
summer();
}
fall();
winter();
}
System.out.println(list.size());
} // end of main
private static void tree_sort() {
Collections.sort(list, new Comparator<tree>() {
@Override
public int compare(tree o1, tree o2) {
return o1.age - o2.age;
}
});
}
private static void spring() {
int list_size = list.size();
delete_list = new ArrayList<>();
for (int i = 0; i < list_size; i++) {
int r = list.get(i).r;
int c = list.get(i).c;
int age = list.get(i).age;
// 현재땅의 양분이 나무의 나이보다 크거나 같으면 땅양분상태와 나무나이를 갱신해준다
if (ground[r][c] >= age) {
ground[r][c] -= age;
list.set(i, new tree(r, c, ++age));
// 반대의 경우 여름에 양분으로 사용할 죽은 나무 리스트에 add해주고 현재 나무 리스트에서 삭제 해준다
} else if (ground[r][c] < age) {
delete_list.add(i);
dead_list.add(new tree(r, c, age));
}
}
Collections.sort(delete_list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (int i = 0; i < delete_list.size(); i++) {
int index = delete_list.get(i);
list.remove(index);
}
}
private static void summer() {
// 죽은 나무만큼 현재땅의 양분상태를 갱신해준다
for (int i = 0; i < dead_list.size(); i++) {
int r = dead_list.get(i).r;
int c = dead_list.get(i).c;
int age = dead_list.get(i).age;
ground[r][c] += age / 2;
}
dead_list.clear();
}
private static void fall() {
// 나무의 나이가 5의 배수면 인접한 8칸에 나무나이=1인 나무를 생성해준다
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
int r = list.get(i).r;
int c = list.get(i).c;
int age = list.get(i).age;
if(age % 5 == 0) {
for (int j = 0; j < 8; j++) {
int nr = r + dr[j];
int nc = c + dc[j];
if(nr>0 && nr<=N && nc>0 && nc<=N) {
list.add(new tree(nr,nc,1));
}
}
}
else
continue;
}
}
private static void winter() {
// 각칸에 해당하는 양분을 더해준다
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
ground[i][j] += A[i][j];
}
}
}
} // end of class
|
cs |
'APS' 카테고리의 다른 글
BOJ17143_낚시왕 (2) | 2019.05.09 |
---|---|
BOJ17142_연구소3 (0) | 2019.05.07 |
JUNGOL1018_십자카드 문제 (1) | 2019.03.23 |
BOJ14502_연구소 (3) | 2019.03.14 |
BOJ7569_토마토 (0) | 2019.03.12 |