티스토리 뷰

www.acmicpc.net/problem/20057

 

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

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

www.acmicpc.net

 

 

import java.io.*;
import java.util.*;
// 210416

public class Main_BJ_20057_마법사상어와토네이도 {
	static int N;
	static int[][] map;
	static int out;
	
	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("res/input_BJ_20057_마법사상어와토네이도.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		N = stoi(br.readLine());
		map = new int[N+1][N+1];
		out = 0;
	
		for(int i=1; i<=N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=1; j<=N; j++) {
				map[i][j] = stoi(st.nextToken());
			}
		}
		
		rotate();
		System.out.println(out);

		br.close();
	}
	
	// 좌 하 우 상
	static int[] dr = {0, 1, 0, -1};
	static int[] dc = {-1, 0, 1, 0};
	
	static void rotate() {
		int far=0;
		int num = 0;
		int or = N/2+1, oc = N/2+1;
		int nr = or, nc = or;
		
		for(int k=1; k<=N/2; k++) {
			for(int d=0; d<4; d++) {
				if(d==0 || d==2) ++far;
				for(int s=1; s<=far; s++) {
					nr = or + dr[d]*s;
					nc = oc + dc[d]*s;
					move(nr, nc, d);
					//map[nr][nc] = ++num;
				}
				or = nr; oc = nc;
			}
		} // k
		int d=0;
		for(int s=1; s<=far; s++) {
			nr = or+dr[d]*s;
			nc = oc+dc[d]*s;
			move(nr, nc, d);
			//map[nr][nc] = ++num;
		}
	}
	
	// 좌 하 우 상
	static int[] percentage = {1, 1, 2, 2, 5, 7, 7, 10, 10};
	
	static int[][] ddr = { 
			{ -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 }, // 좌
			{ -1, -1, 0, 0, 2, 0, 0, 1, 1, 1 }, // 하
			{ -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 }, // 우
			{ 1, 1, 0, 0, -2, 0, 0, -1, -1, -1 } // 상
	};
	static int[][] ddc = { 
			{ 1, 1, 0, 0, -2, 0, 0, -1, -1, -1 }, // 좌
			{ -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 }, // 하
			{ -1, -1, 0, 0, 2, 0, 0, 1, 1, 1 }, // 우
			{ -1, 1, -2, 2, 0, -1, 1, -1, 1, 0 } // 상
	};
	
	static void move(int nr, int nc, int di) {
		int nnr, nnc, amount;
		int now = map[nr][nc];
		
		for(int d=0; d<=8; d++) {
			nnr = nr + ddr[di][d];
			nnc = nc + ddc[di][d];
			amount = (int)now * percentage[d]/100;
			
			if(nnr<1 || nnr>N || nnc<1 || nnc>N) {
				out += amount;
				map[nr][nc] -= amount;
			
			}
			else {
				map[nnr][nnc] += amount;
				map[nr][nc] -= amount;
			}
		}	
		
		// 남은 양은 a로
		nnr = nr + ddr[di][9];
		nnc = nc + ddc[di][9];
		
		if(nnr<1 || nnr>N || nnc<1 || nnc>N) {
			out += map[nr][nc];
			map[nr][nc] = 0; 
		} else {
			map[nnr][nnc] += map[nr][nc];
			map[nr][nc] = 0; 
		}
	}
	
	static int stoi(String str) {
		return Integer.parseInt(str);
	}
}

'코딩테스트 > 백준' 카테고리의 다른 글

[BJ] 1932. 정수 삼각형  (0) 2021.06.06
[BJ] 17472. 다리 만들기 2  (0) 2021.04.24
[BJ] 17142. 연구소 3  (0) 2021.04.23
[BJ] 17143. 낚시왕  (0) 2021.04.23
[BJ] 20056. 마법사 상어와 파이어볼  (0) 2021.04.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함