알고리즘왕/BOJ

[BOJ/20057/JAVA] 마법사 상어와 토네이도

찌 ㅋ 2021. 4. 6. 23:09
날짜 분류 번호 알고리즘 분류  
21-04-06 BOJ 20057 구현, 시뮬레이션 링크



문제 요약

  1. 토네이도가 중점을 시작으로 이동
  2. 이동하면서 각 칸에 있는 모래가 날아감
    • 주변 칸에 비율이 정해져 있고 이동하고 남은 모든 모래는 이동한 칸의 앞칸으로 전부 이동
  3. 밖으로 나간 모래의 양 구하기

 

풀이

  1. 기존의 모래를 전부 더함
  2. 토네이도가 상하좌우로 움직이면서 모래가 이동할 위치를 tr, tc 배열로 미리 정해놓음
  3. 남은 모래를 기존의 모래 총합에서 뺌

 

더보기
package b20.BOJ_20057_마법사상어와토네이도;

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

public class Main {

	static int[][] tr = { { -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 좌
			{ -1, -1, 0, 0, 0, 0, 1, 1, 2, 1 }, // 하
			{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 우
			{ 1, 1, 0, 0, 0, 0, -1, -1, -2, -1 } };// 상
	static int[][] tc = { { 1, 1, 0, 0, 0, 0, -1, -1, -2, -1 }, // 좌
			{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 하
			{ -1, -1, 0, 0, 0, 0, 1, 1, 2, 1 }, // 우
			{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 } };// 상
	static int[] per = { 1, 1, 2, 2, 7, 7, 10, 10, 5, -1 };

	static int[] dr = { 0, 1, 0, -1 };
	static int[] dc = { -1, 0, 1, 0 };

	static int N, map[][];

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;

		int answer = 0;
		N = Integer.parseInt(br.readLine());
		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());
				answer += map[i][j];
			}
		}

		int r = N / 2;
		int c = N / 2;
		int d = 0;

		for (int step = 1; step < N; step++) {
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < step; j++) {
					r += dr[d];
					c += dc[d];
					move(r, c, d);
				}
				d = (d + 1) % 4;
			}
		}

		for (int i = 1; i < N; i++) {
			r += dr[d];
			c += dc[d];
			move(r, c, d);
		}

		for (int[] m : map) {
			for (int i : m)
				answer -= i;
		}

		System.out.println(answer);

	}

	private static void move(int r, int c, int d) {
		int sand = map[r][c];
		int totSand = sand;
		for (int t = 0; t < 9; t++) {
			int nr = r + tr[d][t];
			int nc = c + tc[d][t];

			int moveSand = sand * per[t] / 100;
			if (check(nr, nc))
				map[nr][nc] += moveSand;
			totSand -= moveSand;
		}
		map[r][c] = 0;
		int nr = r + tr[d][9];
		int nc = c + tc[d][9];
		if (check(nr, nc))
			map[nr][nc] += totSand;

	}

	private static boolean check(int r, int c) {
		if (r >= 0 && c >= 0 && r < N && c < N)
			return true;
		return false;
	}

}

'알고리즘왕 > BOJ' 카테고리의 다른 글

[백준 9012] 괄호 / Kotlin  (0) 2021.11.22
[JAVA/백준/20366] 같이 눈사람 만들래?  (0) 2021.01.20
[JAVA/백준/2585] 경비행기  (0) 2021.01.20
[JAVA/백준/17940] 지하철  (0) 2021.01.18
[JAVA/백준/20437] 문자열 게임 2  (0) 2021.01.17