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 |