날짜 | 분류 | 번호 | 알고리즘 분류 | |
---|---|---|---|---|
21-04-06 | BOJ | 20057 | 구현, 시뮬레이션 | 링크 |
문제 요약
- 토네이도가 중점을 시작으로 이동
- 이동하면서 각 칸에 있는 모래가 날아감
- 주변 칸에 비율이 정해져 있고 이동하고 남은 모든 모래는 이동한 칸의 앞칸으로 전부 이동
- 밖으로 나간 모래의 양 구하기
풀이
- 기존의 모래를 전부 더함
- 토네이도가 상하좌우로 움직이면서 모래가 이동할 위치를 tr, tc 배열로 미리 정해놓음
- 남은 모래를 기존의 모래 총합에서 뺌
더보기
package b20.BOJ_20057_마법사상어와토네이도;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] tr = { { -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 좌
{ -1, -1, 0, 0, 0, 0, 1, 1, 2, 1 }, // 하
{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 우
{ 1, 1, 0, 0, 0, 0, -1, -1, -2, -1 } };// 상
static int[][] tc = { { 1, 1, 0, 0, 0, 0, -1, -1, -2, -1 }, // 좌
{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 }, // 하
{ -1, -1, 0, 0, 0, 0, 1, 1, 2, 1 }, // 우
{ -1, 1, -2, 2, -1, 1, -1, 1, 0, 0 } };// 상
static int[] per = { 1, 1, 2, 2, 7, 7, 10, 10, 5, -1 };
static int[] dr = { 0, 1, 0, -1 };
static int[] dc = { -1, 0, 1, 0 };
static int N, map[][];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int answer = 0;
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());
answer += map[i][j];
}
}
int r = N / 2;
int c = N / 2;
int d = 0;
for (int step = 1; step < N; step++) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < step; j++) {
r += dr[d];
c += dc[d];
move(r, c, d);
}
d = (d + 1) % 4;
}
}
for (int i = 1; i < N; i++) {
r += dr[d];
c += dc[d];
move(r, c, d);
}
for (int[] m : map) {
for (int i : m)
answer -= i;
}
System.out.println(answer);
}
private static void move(int r, int c, int d) {
int sand = map[r][c];
int totSand = sand;
for (int t = 0; t < 9; t++) {
int nr = r + tr[d][t];
int nc = c + tc[d][t];
int moveSand = sand * per[t] / 100;
if (check(nr, nc))
map[nr][nc] += moveSand;
totSand -= moveSand;
}
map[r][c] = 0;
int nr = r + tr[d][9];
int nc = c + tc[d][9];
if (check(nr, nc))
map[nr][nc] += totSand;
}
private static boolean check(int r, int c) {
if (r >= 0 && c >= 0 && r < N && c < N)
return true;
return false;
}
}
'알고리즘왕 > BOJ' 카테고리의 다른 글
[백준 9012] 괄호 / Kotlin (0) | 2021.11.22 |
---|---|
[JAVA/백준/20366] 같이 눈사람 만들래? (0) | 2021.01.20 |
[JAVA/백준/2585] 경비행기 (0) | 2021.01.20 |
[JAVA/백준/17940] 지하철 (0) | 2021.01.18 |
[JAVA/백준/20437] 문자열 게임 2 (0) | 2021.01.17 |