728x90
두 단계로 나누어서 생각하면 간단하다.
1. 먼저 토네이도를 그린다.
2. 각각의 토네이도 좌표에서 주어진 조건처리를 한다
시간을 정해놓고 풀다보니 코드가 깔끔하지 못하다. 짧은 시간안에 정돈된 코드를 짜는 연습을 더 해야겠다.
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
'[Algorithms] > [Problems]' 카테고리의 다른 글
BOJ. 16236번. 아기상어 (0) | 2021.03.14 |
---|---|
BOJ. 20058번. 마법사 상어와 파이어스톰 (0) | 2021.03.11 |
BOJ. 20056번. 마법사 상어와 파이어볼 (0) | 2021.03.10 |
BOJ. 6593번. 상범빌딩 (0) | 2021.02.18 |
BOJ. 17406번. 배열 돌리기 4 (0) | 2021.02.14 |