코드와이
[BAEKJOON] 16235. 나무 재테크 본문
문제링크
16235번: 나무 재테크
부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터
www.acmicpc.net
package acmicpc.Gold4;
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.StringTokenizer;
public class 나무_재테크 {
static int n, m, k, arr[][];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[n][n];
int ans = m;
for(int i = 0 ; i < n ; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < n ; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
ArrayList<Integer>[][] treeInfo = new ArrayList[n][n];
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
treeInfo[i][j] = new ArrayList<Integer>();
}
}
for(int i = 0 ; i < m ; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
int age = Integer.parseInt(st.nextToken());
treeInfo[r][c].add(age);
Collections.sort(treeInfo[r][c]);
}
int[][] nutri = new int[n][n];
for(int i = 0 ; i < n ; i++) {
Arrays.fill(nutri[i], 5);
}
int[] dr = {-1,-1,-1,0,0,1,1,1};
int[] dc = {-1,0,1,-1,1,-1,0,1};
for(int year = 0 ; year < k ; year++) {
// spring & summer
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
int death = 0;
for(int s = 0 ; s < treeInfo[i][j].size() ; s++){
if(nutri[i][j] >= treeInfo[i][j].get(s)) {
nutri[i][j] -= treeInfo[i][j].get(s);
treeInfo[i][j].set(s, treeInfo[i][j].get(s) + 1);
} else {
death += treeInfo[i][j].get(s) / 2;
treeInfo[i][j].remove(s);
s--;
ans--;
}
}
nutri[i][j] += death;
}
}
// fall
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
for(int s = 0 ; s < treeInfo[i][j].size() ; s++) {
if(treeInfo[i][j].get(s) % 5 != 0) continue;
for(int d = 0 ; d < 8 ; d++) {
int nr = i + dr[d];
int nc = j + dc[d];
if(nr < 0 || nc < 0 || nr >= n || nc >= n) continue;
treeInfo[nr][nc].add(0,1);
ans++;
}
}
}
}
// winter
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
nutri[i][j] += arr[i][j];
}
}
}
System.out.println(ans);
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 2637. 장난감조립 (0) | 2021.04.19 |
---|---|
[BAEKJOON] 16236. 아기 상어 (0) | 2021.04.16 |
[BAEKJOON] 7569. 토마토 (0) | 2021.04.15 |
[BAEKJOON] 16973. 직사각형 탈출 (0) | 2021.04.15 |
[BAEKJOON] 11052. 카드 구매하기 (0) | 2021.04.15 |