백준 온라인 저지/Gold

[BOJ] 20057 - 마법사 상어와 토네이도

jooona 2021. 4. 13. 00:23
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/20057

 

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

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

www.acmicpc.net

난이도: 골드 4

사용언어: JAVA

 

풀이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.io.*;
import java.util.*;
 
class Main {
 
    static int[][][] tornado = {{{-20}, {-1-1}, {-10}, {-11}, {0-2}, {1-1}, {10}, {11}, {20}, {0-1}},
            {{0-2}, {1-1}, {0-1}, {-1-1}, {20}, {11}, {01}, {-11}, {02}, {10}},
            {{-20}, {-11}, {-10}, {-1-1}, {02}, {11}, {10}, {1-1}, {20}, {01}},
            {{02}, {-11}, {01}, {11}, {-20}, {-1-1}, {0-1}, {1-1}, {0-2}, {-10}}
    }; // 각 방향별 흩어지는 위치
    static int[][] dir = {{0-1}, {10}, {01}, {-10}}; // 이동 방향
    static int[] percent = {21071510712}; // 각 위치 별 모래가 흩어지는 비율
    static int[][] arr;
    static int N;
    static int x, y;
    static int out = 0// 밖으로 나가는 모래의 총량
 
    public static void move(int d) {
        int nx, ny;
        int sand = 0;
        for (int i = 0; i < 9; i++) {
            nx = x + tornado[d][i][0];
            ny = y + tornado[d][i][1]; // 모래가 흩어질 위치 지정
 
            if (nx < 0 || nx >= N || ny < 0 || ny >= N) { // 격자의 밖으로 나가는 부분
                out += arr[x][y] * (percent[i] * 0.01); // out 변수에 합산
            } else {
                arr[nx][ny] += arr[x][y] * (percent[i] * 0.01); // 격자의 내부라면 해당 위치에 값 합산
            }
            sand += arr[x][y] * (percent[i] * 0.01); // 각각의 위치에 흩어진 모래의 양 계산
        }
        nx = x + tornado[d][9][0];
        ny = y + tornado[d][9][1]; // 알파 값에 해당하는 위치
        if (nx < 0 || nx >= N || ny < 0 || ny >= N) {
            out += arr[x][y] - sand; // 해당 위치가 격자 밖이라면 out 변수에 합산. 알파에는 다른 곳에 뿌려진 모래를 제외한 나머지 모래가 모두 합산됨.
        } else {
            arr[nx][ny] += arr[x][y] - sand; // 격자 내부라면 알파 위치에 값 합산
        }
        arr[x][y] = 0// 기존의 위치를 0
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
 
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
 
        x = N / 2;
        y = N / 2// 격자의 가운데에서 시작
        int times = 0;
        int dist = 1;
        int d = 0;
        while (x != 0 || y != 0) {
            for (int i = 0; i < dist; i++) {
                x += dir[d][0];
                y += dir[d][1]; // 좌표를 토네이도 방향으로 이동
                move(d); // 모래 흩어지는 것 구현
                if (x == 0 && y == 0// 좌측 상단에 도달하면 종료
                    break;
            }
            times++;
            if (times == 2) {
                dist++;
                times = 0;
            }
            d = d + 1 == 4 ? 0 : d + 1// 방향 조절
        }
        bw.write(String.valueOf(out+ "\n");
        bw.flush();
        bw.close();
        br.close();
    }
}
cs

 

반응형

'백준 온라인 저지 > Gold' 카테고리의 다른 글

[BOJ] 1584 - 게임  (0) 2021.04.19
[BOJ] 20159 - 동작 그만. 밑장 빼기냐?  (4) 2021.04.18
[BOJ] 14891 - 톱니바퀴  (0) 2021.04.11
[BOJ] 14499 - 주사위 굴리기  (0) 2021.04.05
[BOJ] 6593 - 상범 빌딩  (0) 2021.03.23