알고리즘 풀이/Java
[알고리즘][X] 나무 타이쿤
Dong's Universe
2024. 3. 25. 17:09
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이 터지게 된다.