๐Ÿ’ฏ CodingTest/CodeTree

[CodeTree] ๋‚˜๋ฌด๋ฐ•๋ฉธ(์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ํ…Œ์ŠคํŠธ 2022 ์ƒ๋ฐ˜๊ธฐ ์˜คํ›„ 2๋ฒˆ ๋ฌธ์ œ)

S.Honey 2024. 10. 10. 20:48

๋ฌธ์ œ

https://www.codetree.ai/training-field/frequent-problems/problems/tree-kill-all?page=4&pageSize=5

 

์ฝ”๋“œํŠธ๋ฆฌ | ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„๋ฅผ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์„

๊ตญ๊ฐ€๋Œ€ํ‘œ๊ฐ€ ๋งŒ๋“  ์ฝ”๋”ฉ ๊ณต๋ถ€์˜ ๊ฐ€์ด๋“œ๋ถ ์ฝ”๋”ฉ ์™•์ดˆ๋ณด๋ถ€ํ„ฐ ๊ฟˆ์˜ ์ง์žฅ ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ๊นŒ์ง€, ๊ตญ๊ฐ€๋Œ€ํ‘œ๊ฐ€ ์—„์„ ํ•œ ์ปค๋ฆฌํ˜๋Ÿผ์œผ๋กœ ์ค€๋น„ํ•ด๋ณด์„ธ์š”.

www.codetree.ai

 


๋ฐฐ์šด ์ 

- 3๊ฐœ์ด์ƒ์˜ if ์กฐ๊ฑด ๋ถ„๊ธฐ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ธฐ 

- ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ•ญ์ƒ์„ฑ ๋ณด์žฅํ•  ๊ฒƒ

- ๊ฐ์ฒด ๊ด€๋ฆฌ


์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

class TreeGroup {
	int x, y;
	int treeNum;
	
	public TreeGroup(int x, int y, int treeNum) {
		this.x = x;
		this.y = y;
		this.treeNum = treeNum;
	}	
}
public class Main {
	static int N, M, K, C, answer;
	static int[][] board;
	static int[][] jecho;
	
	static int[][] dxy = {{-1,0},{1,0},{0,-1},{0,1}};
	static int[][] dxy2 = {{-1,-1},{1,1},{1,-1},{-1,1}};
	static ArrayList<TreeGroup> trees = new ArrayList<>();
	static ArrayList<Integer> spaceCount;
	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());
		C = Integer.parseInt(st.nextToken());
		
		board = new int[N][N];
		jecho = new int[N][N];
		answer = 0;
		
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0; j < N; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
				
				if(board[i][j] != 0 && board[i][j] != -1) {
					trees.add(new TreeGroup(i, j, board[i][j]));
				}
			}
		}
		
		simulation();
		
		System.out.println(answer);
		
	}
	
	static void simulation() { // ์ „์ฒด ์‹œ๋ฎฌ๋ ˆ์ด์…˜
		
		for(int t = 0; t < M; t++) {
			spaceCount = new ArrayList<>();		
			
			growTree(); // ๋‚˜๋ฌด ์„ฑ์žฅ
			widenTree(); // ๋‚˜๋ฌด ํ™•์žฅ
			searchRemoveTree();
		}
	}
	
	static void growTree() { 
		
		// ์ธ์ ‘ํ•œ ๋„ค๊ฐœ์˜ ์นธ์— ๋Œ€ํ•ด์„œ ๋‚˜๋ฌด๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋งŒํผ ์„ฑ์žฅ ์ตœ๋Œ€ 4
		for(int i = 0; i < trees.size(); i++) {
			int spaceCnt = 0;
			int adjTreeCnt = 0;
			for(int d = 0; d < 4; d++) {
				int nx = trees.get(i).x + dxy[d][0];
				int ny = trees.get(i).y + dxy[d][1];
				if(nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
				if(board[nx][ny] == 0 && jecho[nx][ny] == 0){
					spaceCnt++;
				}
				if(board[nx][ny] > 0) {
					adjTreeCnt++;
				}
			}	
			
			board[trees.get(i).x][trees.get(i).y] += adjTreeCnt;
			trees.get(i).treeNum += adjTreeCnt;
			spaceCount.add(spaceCnt);
		}
	}
	
	static void widenTree() { // ๋‚˜๋ฌด ํ™•์žฅ
		int[][] tempBoard = new int[N][N];
		
		// ๋‚˜๋ฌด ์ฃผ๋ณ€ ๋นˆ์นธ(๋‚˜๋ฌด ์—†๊ณ , ์žฅ์• ๋ฌผ ์—†๊ณ , ์ œ์ดˆ์ œ ์—†๋Š”)
		// ๋งŒ์ผ ๋‘ ๋‚˜๋ฌด์—์„œ ํ•œ๊ณณ์— ํ™•์žฅ์„ ๋™์‹œ์— ํ•œ๋‹ค๋ฉด ๋”ํ•ด์คŒ
		for(int i = 0; i < trees.size(); i++) {
			
			if(spaceCount.get(i) == 0) continue;
			
			
			TreeGroup tree = trees.get(i);	
			int childTreeNum = tree.treeNum / spaceCount.get(i);  
			
			for(int d = 0; d < 4; d++) {
				int nx = tree.x + dxy[d][0];
				int ny = tree.y + dxy[d][1];
				
				if(nx < 0 || ny < 0 || nx >= N || ny >= N ) continue;
				if(jecho[nx][ny] > 0) continue; // ์ œ์ดˆ์ œ ์—†๋Š”์ง€ ์ฒดํฌ
				if(board[nx][ny] != 0) continue; // ๋‹ค๋ฅธ ๋‚˜๋ฌด๊ฐ€ ์—†๋Š” ๊ณณ์€ ์•„๋‹Œ์ง€ ์ฒดํฌ
				
				tempBoard[nx][ny] += childTreeNum;
			}
		}
		
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				if(tempBoard[i][j] != 0) {
					board[i][j] = tempBoard[i][j];
					trees.add(new TreeGroup(i, j, tempBoard[i][j]));
				}
			}
		}
	}
	
	static void discountJecho() {
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				if(jecho[i][j] > 0) jecho[i][j] -= 1;
			}
		}
	}
	
	static void searchRemoveTree() { // ๋Œ€๊ฐ ๋ฐฉํ–ฅ์˜ ์ œ๊ฑฐํ•  ๋‚˜๋ฌด ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฉ”์„œ๋“œ
		//์ œ์ดˆ์ œ๊ฐ€ ์žˆ๋Š” ์นธ์€ C๋…„์ดํ›„์— ์‚ฌ๋ผ์ง ์ œ์ดˆ์ œ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ” ๋”ฐ๋กœ ๊ด€๋ฆฌ
		// ๋งŒ์•ฝ ๋ฐ•๋ฉธ์‹œํ‚ค๋Š” ๋‚˜๋ฌด์˜ ์ˆ˜๊ฐ€ ๋™์ผํ•œ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ํ–‰์ด ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ, ๋งŒ์•ฝ ํ–‰์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์—ด์ด ์ž‘์€ ์นธ์— ์ œ์ดˆ์ œ๋ฅผ ๋ฟŒ๋ฆฌ๊ฒŒ ๋จ
		int maxNum = -1;
		TreeGroup maxNumTree = null;
		for(int i = 0; i < trees.size(); i++) {
			TreeGroup tree = trees.get(i);
			int x = tree.x;
			int y = tree.y;
			
			if(board[x][y] > 0 && jecho[x][y] == 0) {
				
				int cnt = countRemovableTree(x, y);
				if(cnt > maxNum) {
					maxNum = cnt;
					maxNumTree = tree;
				}
				else if(cnt == maxNum) {
					if(maxNumTree.x == tree.x) {
						maxNumTree = maxNumTree.y < tree.y ? maxNumTree : tree;
					}
					else maxNumTree = maxNumTree.x < tree.x ? maxNumTree : tree;
				}
			}
		}
		
		if(maxNumTree != null) removeTree(maxNumTree.x, maxNumTree.y);
	}
	
	static int countRemovableTree(int x, int y) { 
		int cnt = board[x][y];
		
		for(int d = 0; d < 4; d++) {
			int nx = x;
			int ny = y;
			for(int i = 0; i < K; i++) {
				nx += dxy2[d][0];
				ny += dxy2[d][1];
				
				if(nx < 0 || ny < 0 || nx >= N || ny >= N ) break;
				if(board[nx][ny] == -1 || board[nx][ny] == 0) break;
				
				cnt += board[nx][ny];
			}
		}
		
		return cnt;
	}
	
	static void removeTree(int x, int y) { 
		discountJecho();
		
		int numOfRemovedTree = board[x][y];
		board[x][y] = 0;
		removeTreeFromTrees(x,y);
		jecho[x][y] = C;
		
		for(int d = 0; d < 4; d++) {
			int nx = x;
			int ny = y;
			for(int i = 0; i < K; i++) {
				nx += dxy2[d][0];
				ny += dxy2[d][1];
				
				if(nx < 0 || ny < 0 || nx >= N || ny >= N ) break;
				if(board[nx][ny] == -1 || board[nx][ny] == 0) {
					jecho[nx][ny] = C;
					break;
				}
				
				numOfRemovedTree += board[nx][ny];
				board[nx][ny] = 0;
				jecho[nx][ny] = C;
				removeTreeFromTrees(nx, ny);
			}
		}
		answer += numOfRemovedTree;
	}
	
	static void removeTreeFromTrees(int x, int y) {
		for(int i = 0; i < trees.size(); i++) {
			TreeGroup tree = trees.get(i);
			if(tree.x == x && tree.y == y)trees.remove(i);
		}
	}
}

ํ’€์ด

1. ๋ฉ”์„œ๋“œ ์ •๋ฆฌ

๋ฉ”์„œ๋“œ ๋ช… ์—ญํ•  ๋น„๊ณ 
main - ์ž…๋ ฅ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ
- turn ๋ณ„ ๊ณผ์ • ์ง„ํ–‰
- simulation ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
 
void simulation() - simulation ์ง„ํ–‰ 
1. GrowTree()
2. WidenTree()
3. SearchRemoveTree()
 spaceCount ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™” : ๋งค ํ„ด ๋ณ„๋กœ ํ™•์žฅ๋˜๋Š” ๊ฐ TreeGroup ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฃผ๋ณ€ ๋นˆ๊ณต๊ฐ„ ์ˆ˜๋ฅผ ์œ ์ง€์‹œํ‚ด
void growTree() - ์ธ์ ‘ํ•œ ๋„ค ๊ฐœ์˜ ์นธ๋“ค์— ๋Œ€ํ•ด์„œ TreeGroup์ด ์กด์žฌํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ๋‚˜๋ฌด ์ˆ˜ ๋งŒํผ ๋‚˜๋ฌด ์ˆ˜๋ฅผ ํ™•์žฅ์‹œํ‚ด  
void widenTree() - ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ์กฐ๊ฑด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฃผ๋ณ€ ๋นˆ ๊ณต๊ฐ„(๋ฒฝ, ์ œ์ดˆ์ œ ๋ฟŒ๋ ค์ง„ ๊ณณ ์ œ์™ธ)์— ๋‚˜๋ฌด ๊ทธ๋ฃน ๋‚ด ๋‚˜๋ฌด์˜ ์ˆ˜๋ฅผ ๋นˆ๊ณต๊ฐ„์˜ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋ชซ ๋งŒํผ ํ™•์žฅ์‹œํ‚ด  
void discountJecho() ์ •์ˆ˜ํ˜• 2์ฐจ์› ๋ฐฐ์—ด jecho ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๊ธฐ์กด์— ์ œ์ดˆ์ œ๊ฐ€ ๋ฟŒ๋ ค์ ธ ์žˆ๋˜ ์˜์—ญ์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ์‹œํ‚ด : ๋งค ํ„ด๋ณ„๋กœ 1์”ฉ ๊ฐ์†Œ  
void searchRemoveTree() ํ•œ ๋‚˜๋ฌด์— ๋ฟŒ๋ ธ์„ ๋•Œ ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ์–ด๋–ค ๋‚˜๋ฌด์— ๋ฟŒ๋ ค์•ผ ๊ฐ€์žฅ ๋งŽ์€ ์ˆ˜์˜ ๋‚˜๋ฌด๋“ค์ด ๋ฐ•๋ฉธ๋˜๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฉ”์„œ๋“œ  
int countRemovableTree(int x, int y) ๋‚˜๋ฌด๊ฐ€ ์œ„์น˜ํ•œ ์ขŒํ‘œ์— ์ œ์ดˆ์ œ๋ฅผ ์‚ดํฌํ•˜๋ฉด ๋ช‡ ๊ทธ๋ฃจ์˜ ๋‚˜๋ฌด๊ฐ€ ๋ฐ•๋ฉธ๋˜๋Š”์ง€ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ  
void removeTree(int x, int y) ์‹ค์ œ ๋‚˜๋ฌด๋ฅผ ๋ฐ•๋ฉธํ•˜๋Š” ๋ฉ”์„œ๋“œ  
void removeTreeFromTrees(int x, int y) ๋‚˜๋ฌด ๊ทธ๋ฃน์—์„œ ๋‚˜๋ฌด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฉ”์„œ๋“œ(Trees ๋ฆฌ์ŠคํŠธ์—์„œ TreeGroup ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐ) by ์ขŒํ‘œ๋น„๊ต  

 

- ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ •๋ง ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์˜€๋‹ค. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋ฐ”ํƒ•์œผ๋กœ if ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐ์ฒด ๊ด€๋ฆฌ์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ์—ฌ์„œ ๋ณ„๋„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…์ด ํ•„์š”ํ•˜์ง„ ์•Š์•˜๋‹ค. 

- ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด ๋„ฃ์„ ์ˆœ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋ƒฅ dxy(์ƒํ•˜์ขŒ์šฐ), dxy2(์ขŒ์ƒ->์šฐํ•˜, ์šฐ์ƒ->์ขŒํ•˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ) ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด๋†“๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.