본문 바로가기

[Algorithms]/[Problems]

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

728x90

 

두 단계로 나누어서 생각하면 간단하다.

1. 먼저 토네이도를 그린다.
2. 각각의 토네이도 좌표에서 주어진 조건처리를 한다

시간을 정해놓고 풀다보니 코드가 깔끔하지 못하다. 짧은 시간안에 정돈된 코드를 짜는 연습을 더 해야겠다.

www.acmicpc.net/problem/20057

 

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

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

www.acmicpc.net

 

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

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	
	static int n,d=0;
	static int ans;
	static int[][] map;
//						좌 하  우 상
	static int[] dy = { 0, 1, 0,-1};
	static int[] dx = {-1, 0, 1, 0};
	
	private static boolean checkBound(int y, int x) {
		return (y>=0 && y<n && x>=0 && x<n) ? true : false; 
	}

	private static void solution(int y, int x) {
		int sand = map[y][x];
		int alpha = sand;
		map[y][x] = 0;
		// 5%
		if(checkBound(y+dy[d]*2,x+dx[d]*2)) {
			map[y+dy[d]*2][x+dx[d]*2] += (int)(sand*0.05); // 5%
		}else {
			ans += (int)(sand*0.05);
		}
		alpha -= (int)(sand*0.05);
		//위쪽 ㅗ
		int td = (d+1)%4;
		if(checkBound(y+dy[td],x+dx[td])) {
			map[y+dy[td]][x+dx[td]] += (int)(sand*0.07);  // 7%
		}else {
			ans += (int)(sand*0.07);
		}
		alpha -= (int)(sand*0.07);
		if(checkBound(y+dy[td]+dy[d],x+dx[td]+dx[d])) {
			map[y+dy[td]+dy[d]][x+dx[td]+dx[d]] += (int)(sand*0.1); // 10%
		}else {
			ans += (int)(sand*0.1);
		}
		alpha -= (int)(sand*0.1);
		if(checkBound(y+dy[td]*2,x+dx[td]*2)) {
			map[y+dy[td]*2][x+dx[td]*2] += (int)(sand*0.02); // 2%
		}else {
			ans += (int)(sand*0.02); 
		}
		alpha -= (int)(sand*0.02);
		if(checkBound(y+dy[td]-dy[d],x+dx[td]-dx[d])) {
			map[y+dy[td]-dy[d]][x+dx[td]-dx[d]] += (int)(sand*0.01); // 1%
		}else {
			ans += (int)(sand*0.01);
		}
		alpha -= (int)(sand*0.01);
		//아래쪽 ㅜ
		int ttd = (d+3)%4;
		if(checkBound(y+dy[ttd],x+dx[ttd])) {
			map[y+dy[ttd]][x+dx[ttd]] += (int)(sand*0.07);  // 7%
		}else {
			ans += (int)(sand*0.07); 
		}
		alpha -= (int)(sand*0.07); 
		if(checkBound(y+dy[ttd]+dy[d],x+dx[ttd]+dx[d])) {
			map[y+dy[ttd]+dy[d]][x+dx[ttd]+dx[d]] += (int)(sand*0.1);  // 10% 
		}else {
			ans += (int)(sand*0.1);
		}
		alpha -= (int)(sand*0.1);
		if(checkBound(y+dy[ttd]*2,x+dx[ttd]*2)) {
			map[y+dy[ttd]*2][x+dx[ttd]*2] += (int)(sand*0.02);  // 2%
		}else {
			ans += (int)(sand*0.02);
		}
		alpha -= (int)(sand*0.02);
		if(checkBound(y+dy[ttd]-dy[d],x+dx[ttd]-dx[d])) {
			map[y+dy[ttd]-dy[d]][x+dx[ttd]-dx[d]] += (int)(sand*0.01);  // 1%
		}else {
			ans += (int)(sand*0.01); 
		}
		alpha -= (int)(sand*0.01); 
//		System.out.println(d + " " + (y+dy[d]) + " "  + (x+dx[d]) + " " + y + " " + x);
		// 알파
		if(checkBound(y+dy[d],x+dx[d])) {
			map[y+dy[d]][x+dx[d]] += alpha; 
		}else {
			ans += alpha;
		}
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		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());
			}
		}
		
		int sy=n/2;
		int sx=n/2;
		int cnt=0;
		int size=1;
cycle: while(true) {
			for(int i=0; i<2; i++) {
				for(int j=0; j<size; j++) {
					sy += dy[d];
					sx += dx[d];
					solution(sy,sx);
				}
				d = (d+1)%4;
			} 
			size++;
			if(size==n) {
				for(int j=0; j<size-1; j++) {
					sy += dy[d];
					sx += dx[d];
					solution(sy,sx);
				}
				break cycle;
			}
		}
		
		System.out.println(ans);
	}

}
728x90