알고리즘/백준

20057 - 마법사 상어와 토네이도

www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

1. 유형

- 구현

 

2. 풀이

 

 

3. 코드

import java.util.*;
import java.io.*;

public class Main {
	static int N;
	static int map[][];
	static int currentR, currentC, sum;
	static int dir[][] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 } };// 좌하우상
	static int moveCnt[] = { 1, 1, 2, 2 };
	static int percent[] = { 1, 1, 2, 2, 5, 7, 7, 10, 10 };
	static int spreadR[][] = { { -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 }, { 0, 0, 1, 1, 3, 1, 1, 2, 2, 2 },
			{ -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 }, { 0, 0, -1, -1, -3, -1, -1, -2, -2, -2 } };
	static int spreadC[][] = { { 0, 0, -1, -1, -3, -1, -1, -2, -2, -2 }, { -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 },
			{ 0, 0, 1, 1, 3, 1, 1, 2, 2, 2 }, { -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 } };
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;

	public static void main(String[] args) throws IOException {
		input();
		int answer = solution();
		System.out.println(answer);
	}

	static void input() throws IOException {
		st = new StringTokenizer(in.readLine());
		N = Integer.valueOf(st.nextToken());
		map = new int[N][N];
		currentR = N / 2;
		currentC = N / 2;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.valueOf(st.nextToken());
			}
		}
	}

	static int solution() {
		int outSendTotal = 0;
		out: while (true) {
			for (int d = 0; d < 4; d++) {
				for (int mv = 0; mv < moveCnt[d]; mv++) {
					if (currentR == 0 && currentC == 0)// 0,0이면 끝나는 지점
						break out;
					int yr = currentR + dir[d][0];
					int yc = currentC + dir[d][1];
					int moveSendTotal = 0;
					for (int rate = 0; rate < 9; rate++) {// 비율이 있는 부분 모래이동
						int nextR = currentR + spreadR[d][rate];
						int nextC = currentC + spreadC[d][rate];
						int rateSend = (int) ((double) percent[rate] / 100 * map[yr][yc]);
						moveSendTotal += rateSend;// 움직인 모래 총합
						if (nextR < 0 || nextR >= N || nextC < 0 || nextC >= N) {
							outSendTotal += rateSend;
							continue;
						}
						map[nextR][nextC] += rateSend;
					}
					// 알파부분
					int ar = currentR + spreadR[d][9];
					int ac = currentC + spreadC[d][9];
					if (ar < 0 || ar >= N || ac < 0 || ac >= N) {
						outSendTotal += (map[yr][yc] - moveSendTotal);
					} else {
						map[ar][ac] += (map[yr][yc] - moveSendTotal);
					}
					// 모두 이동해서 0으로 만들기
					map[yr][yc] = 0;
					// 현재 좌표 이동
					currentR = yr;
					currentC = yc;
				}
				moveCnt[d] += 2;// 한 방향으로 이동 거리는 2씩 증가
	//			System.out.println();
			}
		}
		return outSendTotal;
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 3190 - (python) 뱀  (0) 2021.04.27
20055 - [Java]컨베이어 벨트 위의 로봇  (0) 2021.04.21
백준 - 6087 레이저 통신  (0) 2021.03.13
백준 - 2458 키순서  (0) 2021.03.13
백준 - 19591 독특한 계산기  (0) 2021.03.10