๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/16235
16235๋ฒ: ๋๋ฌด ์ฌํ ํฌ
๋ถ๋์ฐ ํฌ์๋ก ์ต๋์ ๋์ ๋ฒ ์๋๋ ์ต๊ทผ N×N ํฌ๊ธฐ์ ๋ ์ ๊ตฌ๋งคํ๋ค. ์๋๋ ์์ฌ์ด ๋ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ ์ 1×1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด ๋์๋ค. ๊ฐ๊ฐ์ ์นธ์ (r, c)๋ก ๋ํ๋ด๋ฉฐ, r์ ๊ฐ์ฅ ์์์๋ถํฐ
www.acmicpc.net
ํ์ด
๋ฌธ์ ๋ด์ฉ๊ณผ ๊ตฌํ ์์ฒด๋ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ง๋ง, ์๊ฐ ์ ํ์ด ๋นก๋นกํ ๋ฌธ์ ์๋ค. ๊ทธ๋์ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ง ๋ง์ด ๊ณ ๋ฏผํ๋ค.
๋ฌธ์ ์์ ํ๋์ ์นธ์ ์ฌ๋ฌ ๊ฐ์ ๋๋ฌด๊ฐ ์๋ค๋ฉด, ๋์ด๊ฐ ์ด๋ฆฐ ๋๋ฌด๋ถํฐ ์๋ถ์ ๋จน๋๋ค. ๊ณ ํ์ผ๋ฏ๋ก, ๋์ด๊ฐ ์ด๋ฆฐ ๋๋ฌด๋ถํฐ ์ํํด์ผ ํ๋ค. ํ์ง๋ง ๋งค๋ ๋๋ฌด๋ฅผ ๋์ด ์์ผ๋ก ์ ๋ ฌํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ ๊ฒ ๊ฐ์๊ธฐ ๋๋ฌธ์, ์ต์ด 1๋ฒ๋ง ์ ๋ ฌํ ๋ค์ ์๋ฎฌ๋ ์ด์ ์ ์งํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด Deque์ ์ฌ์ฉํ๋ค. ๋ณ๋์ ์ ๋ ฌ ์์ด ์๋ฎฌ๋ ์ด์ ์ ์งํํ๋ ค๋ฉด, head์ tail ์ ๋์์ ์์๋ฅผ ๋ฃ๊ณ ๋นผ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฑ์ head์์ tail๋ก ๊ฐ์๋ก ๋๋ฌด์ ๋์ด๊ฐ ๋ง์์ง๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- head์์ ๋๋ฌด๋ฅผ ๊บผ๋ด ์๋ถ์ ๋จน์ด๊ณ ๋์ด๋ฅผ ์ฆ๊ฐ์ํจ ๋ค, tail์ ๋ฃ์ด์ฃผ๋ฉด ๋์ด ์ ์ ๋ ฌ์ ์ ์งํ ์ ์๋ค.
- ๋์ด๊ฐ 1์ธ ๋๋ฌด๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋, head์ ์์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋์ด ์ ์ ๋ ฌ์ ์ ์งํ ์ ์๋ค.
(0) ํธ๋ฆฌ ํด๋์ค
class Tree implements Comparable<Tree>{
int x;
int y;
int age;
public Tree(int x, int y, int age) {
this.x = x;
this.y = y;
this.age = age;
}
@Override
public int compareTo(Tree o) {
return this.age - o.age;
}
}
๋ฌธ์ ์ ๋์ด๊ฐ ์ ์ ๋๋ฌด๋ถํฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค๋ ์กฐ๊ฑด์ด ์์ด์, ์ต์ด 1๋ฒ์ ์ ๋ ฌ์ด ํ์ํ๋ค. ๋๋ฌธ์ Comparable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ compareTo() ํจ์๋ฅผ ๊ตฌํํด์ฃผ์๋ค.
(1) ๋ด
- ๋ฑ์ ๋จธ๋ฆฌ์์ ๋๋ฌด๋ฅผ ํ๋ ๊บผ๋ธ๋ค.
- ๋ ์ ์๋ถ์ด ๋ถ์กฑํ๋ค๋ฉด deadTree์ ๋๋ฌด๋ฅผ ์ถ๊ฐํ๋ค.
- ์๋ถ์ด ์ถฉ๋ถํ๋ค๋ฉด, ๋ ์ ์๋ถ์ ๊ฐ์์ํค๊ณ ๋๋ฌด์ ๋์ด๋ฅผ ์ฆ๊ฐ์ํจ ํ, ๋ฑ์ ๊ผฌ๋ฆฌ์ ๋๋ฌด๋ฅผ ๋ฃ์ด์ค๋ค.
public static List<Tree> spring() {
List<Tree> deadTree = new ArrayList<>();
int size = trees.size();
for (int i=0; i<size; i++) {
Tree tree = trees.poll();
if(tree.age > nutrient[tree.x][tree.y]) {
deadTree.add(tree);
continue;
}
nutrient[tree.x][tree.y] -= tree.age;
tree.age++;
trees.add(tree);
}
return deadTree;
}
(2) ์ฌ๋ฆ
- ๋ด์ ์ฃฝ์ ๋๋ฌด๋ค์ ์๋ถ์ผ๋ก ๋ณํ์ํจ๋ค.
public static void summer(List<Tree> deadTree) {
for (Tree tree : deadTree) {
nutrient[tree.x][tree.y] += (tree.age/2);
}
}
(3) ๊ฐ์
- ๋ฑ์ ๋ด๊ธด ๋๋ฌด๋ฅผ ์ํํ๋ค.
- ๋๋ฌด์ ๋์ด๊ฐ 5์ ๋ฐฐ์๋ผ๋ฉด, ํด๋น ๋๋ฌด๋ฅผ copiedTree์ ๋ฃ์ด์ค๋ค.
- copiedTree์ ๋๋ฌด๋ค์ ๋ฑ์ ๋จธ๋ฆฌ์ ๋ฃ์ด์ค๋ค.
public static void fall() {
List<Tree> copiedTree = new ArrayList<>();
for (Tree tree : trees) {
if(tree.age%5 == 0) {
copiedTree.add(tree);
}
}
for (Tree tree : copiedTree) {
for (int i=0; i<8; i++) {
int nx = tree.x+dx[i];
int ny = tree.y+dy[i];
if(nx<0 || ny<0 || nx>=N || ny>=N) continue;
trees.addFirst(new Tree(nx, ny, 1));
}
}
}
(4) ๊ฒจ์ธ
- ๋ ์ ์๋ถ์ ์ถ๊ฐํ๋ค.
public static void winter() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
nutrient[i][j] += A[i][j];
}
}
}
์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.StringTokenizer;
class Tree implements Comparable<Tree>{
int x;
int y;
int age;
public Tree(int x, int y, int age) {
this.x = x;
this.y = y;
this.age = age;
}
@Override
public int compareTo(Tree o) {
return this.age - o.age;
}
}
public class Main {
static int N, M, K;
static int[] dx = {-1,-1,-1,0,0,1,1,1}, dy = {-1,0,1,-1,1,-1,0,1};
static int[][] A, nutrient;
static Deque<Tree> trees = new ArrayDeque<>();
public static void main(String[] args) throws 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());
A = new int[N][N];
nutrient = new int[N][N];
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for (int j=0; j<N; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i=0; i<N; i++) {
Arrays.fill(nutrient[i], 5);
}
List<Tree> treeList = new ArrayList<>();
for (int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
int age = Integer.parseInt(st.nextToken());
treeList.add(new Tree(x, y, age));
}
Collections.sort(treeList); // ๋์ด ์ ์ ๋ ฌ
for (Tree tree : treeList) {
trees.add(tree);
}
while(K>0) {
List<Tree> deadTree = spring();
summer(deadTree);
fall();
winter();
K--;
}
System.out.println(trees.size());
}
public static List<Tree> spring() {
List<Tree> deadTree = new ArrayList<>();
int size = trees.size();
for (int i=0; i<size; i++) {
Tree tree = trees.poll();
if(tree.age > nutrient[tree.x][tree.y]) {
deadTree.add(tree);
continue;
}
nutrient[tree.x][tree.y] -= tree.age;
tree.age++;
trees.add(tree);
}
return deadTree;
}
public static void summer(List<Tree> deadTree) {
for (Tree tree : deadTree) {
nutrient[tree.x][tree.y] += (tree.age/2);
}
}
public static void fall() {
List<Tree> copiedTree = new ArrayList<>();
for (Tree tree : trees) {
if(tree.age%5 == 0) {
copiedTree.add(tree);
}
}
for (Tree tree : copiedTree) {
for (int i=0; i<8; i++) {
int nx = tree.x+dx[i];
int ny = tree.y+dy[i];
if(nx<0 || ny<0 || nx>=N || ny>=N) continue;
trees.addFirst(new Tree(nx, ny, 1));
}
}
}
public static void winter() {
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
nutrient[i][j] += A[i][j];
}
}
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |
---|---|
[๋ฐฑ์ค 6086] ์ต๋ ์ ๋ (0) | 2023.08.28 |
[๋ฐฑ์ค 1062] ๊ฐ๋ฅด์นจ (0) | 2023.08.28 |
[๋ฐฑ์ค 2342] Dance Dance Revolution (0) | 2023.08.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋์คํฌ ์ปจํธ๋กค๋ฌ (1) | 2023.08.27 |