파게로그
[백준 20057번] 마법사 상어와 토네이도 본문
문제 링크: 20057번 마법사 상어와 토네이도
https://www.acmicpc.net/problem/20057
문제에서 나오는 대로 구현하면 되지만, 까다로운 부분이 있었다.
첫째로, 모래가 이동하는 목적지의 좌표를 토네이도의 방향에 따라 이동해주는 것이 까다로웠다. 직접 4개의 배열을 작성했는데, 이것보다 간결한 방법이 있는지 알아보아야겠다.
둘째로, α로 이동하는 모래의 양이 단순하게 55%가 아니라는 것이다.
셋째로, 토네이도의 이동 길이이다. 이동 거리를 0부터 시작해서 서쪽으로 이동할 때 또는 동쪽으로 이동할 때마다 이동 거리가 1씩 증가하도록 하였다.
넷째로, 토네이도의 이동 방향이다. dirCnt
라는 변수를 통해 모듈러 연산을 활용했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int n;
static int row;
static int col;
static int answer;
static int movedSandSum;
static int[] drow = {0, 1, 0, -1}; // west south east north
static int[] dcol = {-1, 0, 1, 0};
static void moveSandSolution(int r, int c, int vol) {
// r, c: 모래가 이동하는 목적지
// vol: 모래가 이동하는 양
movedSandSum += vol;
if (r<0||c<0||r>n-1||c>n-1)
answer += vol;
else
map[r][c] += vol;
}
static void moveSand(int dir) {
int[] adjPos;
switch (dir) {
case 0: // west
adjPos = new int[]{-1, 0, 1, 0, -2, -1, 2, -1, 0, -3, -1, -1, 1, -1, -1, -2, 1, -2, 0, -2};
break;
case 1: // south
adjPos = new int[]{0, -1, 0, 1, 1, -2, 1, 2, 3, 0, 1, -1, 1, 1, 2, -1, 2, 1, 2, 0};
break;
case 2: // east
adjPos = new int[]{-1, 0, 1, 0, -2, 1, 2, 1, 0, 3, -1, 1, 1, 1, -1, 2, 1, 2, 0, 2};
break;
case 3: // north
adjPos = new int[]{0, 1, 0, -1, -1, -2, -1, 2, -3, 0, -1, -1, -1, 1, -2, -1, -2, 1, -2, 0};
break;
default:
adjPos = new int[]{};
break;
}
int nrow = row + drow[dir];
int ncol = col + dcol[dir];
movedSandSum = 0;
moveSandSolution(row+adjPos[0], col+adjPos[1], map[nrow][ncol]/100);
moveSandSolution(row+adjPos[2], col+adjPos[3], map[nrow][ncol]/100);
moveSandSolution(row+adjPos[4], col+adjPos[5], map[nrow][ncol]*2/100);
moveSandSolution(row+adjPos[6], col+adjPos[7], map[nrow][ncol]*2/100);
moveSandSolution(row+adjPos[8], col+adjPos[9], map[nrow][ncol]*5/100);
moveSandSolution(row+adjPos[10], col+adjPos[11], map[nrow][ncol]*7/100);
moveSandSolution(row+adjPos[12], col+adjPos[13], map[nrow][ncol]*7/100);
moveSandSolution(row+adjPos[14], col+adjPos[15], map[nrow][ncol]*10/100);
moveSandSolution(row+adjPos[16], col+adjPos[17], map[nrow][ncol]*10/100);
moveSandSolution(row+adjPos[18], col+adjPos[19], map[nrow][ncol] - movedSandSum);
map[nrow][ncol] = 0;
row = nrow;
col = ncol;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(new StringTokenizer(br.readLine()).nextToken());
map = new int[n][n];
for (int i = 0; i < n; i++)
map[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
row = n/2;
col = n/2;
int moveLen = 0;
int dirCnt = 0; // west 4k, south 4k-3, east 4k-2, north 4k-1
outer:
while (true) {
int dir = dirCnt % 4;
dirCnt++;
if (dir==0 || dir==2)
moveLen++; // when turn to east, tornado moves a block more
for (int l=0; l<moveLen; l++) {
if (row==0 && col==0)
break outer;
moveSand(dir);
}
}
System.out.println(answer);
}
}
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백준 19236번] 청소년 상어 (0) | 2021.02.18 |
---|---|
[백준 15686번] 치킨 배달 (0) | 2021.02.09 |
[백준 14890번] 경사로 (0) | 2021.02.09 |
[백준 7562번] 나이트의 이동 (0) | 2020.12.30 |
[백준 4963번] 섬의 개수 (0) | 2020.12.30 |
Comments