Java

[백준 21620] 마법사 상어와 비바라기 (JAVA)

iheeeee6-6 2023. 5. 30. 17:25
728x90

https://www.acmicpc.net/problem/21610

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

 

처음에, 구름의 한 지점만 cloud 리스트에 넣고 풀다보니 

이동할때 배열의 사이즈를 벗어나는 그런 골치 아픈 점이 생겼다,,

따라서 쉽게 구름의 4지점을 모두 리스트에 넣고 이동하는 것으로 변경했다.

 

c.x = (n + c.x + dx[dir-1] * (len % n)) % n;
c.y = (n + c.y + dy[dir-1] * (len % n)) % n;

구름 이동은 위와 같이 계산한다.

 

그리고 놓친 점이 하나 더 있었다.

5. 바구니에 저장된 물의 양이 2 이상인 모든 칸에 구름이 생기고, 물의 양이 2 줄어든다. 이때 구름이 생기는 칸은 3에서 구름이 사라진 칸이 아니어야 한다.

-> 해당 턴에서의 3번에서 사라진 칸에 해당이 되면 안되는거지, 그 이전 턴에서의 구름은 상관없다는 것!

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {

	static int n, m;
	static int[][] arr;
	static int[][] marr;

	static ArrayList<Cloud> cloudTemp;
	static ArrayList<Cloud> cloud;
	static boolean[][] visited;

	static class Cloud {
		int x, y;

		Cloud(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}

	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());

		arr = new int[n][n];
		marr = new int[m][2];
		cloudTemp = new ArrayList<>();
		cloud = new ArrayList<>();
		cloud.add(new Cloud(n - 1, 0)); // n-1,0 n-1 1, n-2 0, n-2 1
		cloud.add(new Cloud(n - 1, 1));
		cloud.add(new Cloud(n - 2, 0));
		cloud.add(new Cloud(n - 2, 1));
		visited = new boolean[n][n];

		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());
			}
		}

		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			marr[i][0] = Integer.parseInt(st.nextToken()); // 1부터 순서대로 ←, ↖, ↑, ↗, →, ↘, ↓, ↙
			marr[i][1] = Integer.parseInt(st.nextToken());
		}

		solution();

		int result = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (arr[i][j] > 0)
					result += arr[i][j];
			}
		}

		System.out.println(result);
	}

	static void solution() {
		for (int i = 0; i < m; i++) {
			cloudMove(i);
			magic();
			cloud = new ArrayList<>();
			minus();
		}
	}

	static void minus() {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (arr[i][j] >= 2&&!visited[i][j]) {
					arr[i][j] -= 2;
					if (arr[i][j] < 0)
						arr[i][j] = 0;
						cloud.add(new Cloud(i, j));
				}else visited[i][j]=false;
			}
		}
	}

	static void magic() {
		for (Cloud c : cloud) {
			int count = 0;
			if (c.x - 1 >= 0 && c.x - 1 < n && c.y - 1 >= 0 && c.y - 1 < n && arr[c.x - 1][c.y - 1] > 0)
				count++;
			if (c.x + 1 >= 0 && c.x + 1 < n && c.y - 1 >= 0 && c.y - 1 < n && arr[c.x + 1][c.y - 1] > 0)
				count++;
			if (c.x + 1 >= 0 && c.x + 1 < n && c.y + 1 >= 0 && c.y + 1 < n && arr[c.x + 1][c.y + 1] > 0)
				count++;
			if (c.x - 1 >= 0 && c.x - 1 < n && c.y + 1 >= 0 && c.y + 1 < n && arr[c.x - 1][c.y + 1] > 0)
				count++;
			arr[c.x][c.y] += count;
		}
	}

	static void cloudMove(int idx) {
		for (Cloud c : cloud) {
			int dir = marr[idx][0];
			int len = marr[idx][1];

			int[] dx = { 0, -1, -1, -1, 0, 1, 1, 1 };
			int[] dy = { -1, -1, 0, 1, 1, 1, 0, -1 };

			c.x = (n + c.x + dx[dir-1] * (len % n)) % n;
			c.y = (n + c.y + dy[dir-1] * (len % n)) % n;
			arr[c.x][c.y]++;
			visited[c.x][c.y] = true;
		}
	}
}

'Java' 카테고리의 다른 글

[백준 8980] 택배 (JAVA)  (0) 2023.05.31
[백준 9082] 지뢰찾기 (JAVA)  (0) 2023.05.30
[백준 15685] 드래곤 커브(JAVA)  (0) 2023.05.30
[백준 2573] 빙산 (JAVA)  (1) 2023.05.25
[백준 1937] 욕심쟁이 판다 (JAVA)  (0) 2023.05.23