알고리즘 풀이/Java

[알고리즘][X] 나무 타이쿤

Dong's Universe 2024. 3. 25. 17:09

https://www.codetree.ai/training-field/frequent-problems/problems/tree-tycoon/description?page=2&pageSize=20

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	static int[][] map;
	static int[][] move;
//	static int[] dx = {0, -1, -1, -1, 0, 1, 1, 1};
//	static int[] dy = {1, 1, 0 ,-1, -1, -1, 0, 1};
	static int[] dx = {0, -1, -1, -1, 0, 1, 1, 1};
	static int[] dy = {-1, -1, 0 ,1, 1, 1, 0, -1};
	static int n;
	static int m;
	static List<Point> nut;
	static int[][] newMap;
	static boolean[][] visited;
	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());
		
		map = new int[n][n];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		move = new int[m][2];
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < 2; j++) {
				move[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		nut = new ArrayList<>();
		nut.add(new Point(n-1, 0));
		nut.add(new Point(n-2, 0));
		nut.add(new Point(n-1, 1));
		nut.add(new Point(n-2, 1));
		
		for (int i = 0; i < m; i++) {
			year(i);
		}
//		for (int i = 0; i < n; i++) {
//			for (int j = 0; j < n; j++) {
//				System.out.print(map[i][j] + " "); 
//			}
//			System.out.println();
//		}
		System.out.println(findSum());
	}
	private static int findSum() {
		int sum = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				sum += map[i][j];
			}
		}
		return sum;
	}
	private static void year(int k) {
		visited = new boolean[n][n];
		newMap = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				newMap[i][j] = map[i][j];
			}
		}
		
		for (Point point : nut) {
			Point nextPoint = afterMove(point, move[k][0]-1, move[k][1]);
			int x = nextPoint.x;
			int y = nextPoint.y;
			map[x][y] += 1;
		}
		for (Point point : nut) {
			Point nextPoint = afterMove(point, move[k][0]-1, move[k][1]);
			int x = nextPoint.x;
			int y = nextPoint.y;
			int newCnt = update(nextPoint);
			newMap[x][y] = map[x][y] + newCnt;
			visited[x][y] = true;
		}
		
		map = newMap;
		nut = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <n; j++) {
				if (visited[i][j]) {
					continue;
				}
				if (map[i][j] >= 2) {
					map[i][j] -= 2;
					nut.add(new Point(i, j));
				}
			}
		}
		return;
	}
	private static int update(Point nextPoint) {
		int[] dx = {-1, -1, 1, 1};
		int[] dy = {-1, 1, -1, 1};
		
		int x= nextPoint.x;
		int y= nextPoint.y;
		
		int count = 0;
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if (0 <= nx && nx < n && 0 <= ny && ny < n && map[nx][ny] >= 1) {
				count++;
			}
		}
		
		return count;
	}
	private static Point afterMove(Point point, int d, int p) {
		int x = point.x;
		int y = point.y;
		
		int nx = x + dx[d] * p;
		int ny = y + dy[d] * p;
		
		nx = tuning(nx);
		ny = tuning(ny);
		
		return new Point(nx, ny);
	}
	private static int tuning(int x) {
		if (x >= n) {
			return x % n;
		}
		if (x < 0) {
			while (x < 0) {
				x += n;
			}
			return x;
		}
		return x;
	}
}

나의 풀이

- 구현하면 되는 문제

- 다만 방향이 index가 1부터 시작한다는 걸 인지를 못하고 0부터 고려하여 틀렸다.

- 또한 tuning에서 x < 0일 때 x += n만 하게 했는데 2*n만큼 빠지게 되면 x += n으로도 회복이 안되서 NullPointerException이 터지게 된다.