알고리즘 문제 풀이/BOJ

[backjoon] 20057 마법사 상어와 토네이도 java

v 2022. 4. 29. 20:09

https://www.acmicpc.net/problem/20057

 

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

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

www.acmicpc.net

배열을 달팽이모양으로 순회하고 비율에 맞게 모래 값을 처리하면 된다.

주의할 점은 방향 따라서 값도 바뀌기때문에 방향에 맞게 비율들의 이동 값도 일일이 정해줘야한다.

 

 

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
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.io.*;
import java.util.*;
 
/*
 */
public class Main {
    static int[][] map;
    static int N, answer;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        map = new int[N][N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                int cur = Integer.parseInt(st.nextToken());
                map[i][j] = cur;
            }
        }
        answer = 0;
        // 달팽이 회전하기
        torando();
        // 점수 매기기
        System.out.println(answer);
    }
 
    private static void torando() {
        int row = N / 2;
        int col = N / 2;
        int length = 1;
        int d = 0;
        int[][] dirs = { { 0-1 }, { 10 }, { 01 }, { -10 } };
        while (length < N) {
 
            for (int i = 0; i < length; i++) {
                row += dirs[d][0];
                col += dirs[d][1];
                spread(d, row, col);
            }
            d = (d + 1) % 4;
            for (int i = 0; i < length; i++) {
                row += dirs[d][0];
                col += dirs[d][1];
                spread(d, row, col);
            }
            d = (d + 1) % 4;
            length++;
        }
        for (int i = 0; i < length - 1; i++) {
            row += dirs[d][0];
            col += dirs[d][1];
            spread(d, row, col);
        }
 
    }
 
    private static void spread(int dir, int row, int col) {
        int[][] dr = { { -11-22-11-1100 }, //
                { -1-100001121 }, //
                { -11-22-11-1100 }, //
                { 110000-1-1-2-1 } }; // 서, 남, 동, 북 방향
        int[][] dc = { { 110000-1-1-2-1 }, //
                { -11-22-11-1100 }, //
                { -1-100001121 }, //
                { -11-22-11-1100 } };
        int[] percent = { 11227710105 };
        int alpha = 0;
        int origin = map[row][col];
        for (int d = 0; d < 9; d++) {
            int nextR = row + dr[dir][d];
            int nextC = col + dc[dir][d];
            double rate = (map[row][col] * percent[d]) / 100;
            alpha += rate;
            if (nextR < 0 || nextC < 0 || nextR >= N || nextC >= N) {
                answer += rate;
            } else {
                map[nextR][nextC] += rate;
            }
        }
        alpha = origin - alpha;
        int nextR = row + dr[dir][9];
        int nextC = col + dc[dir][9];
        if (nextR < 0 || nextC < 0 || nextR >= N || nextC >= N) {
            answer += alpha;
        } else {
            map[nextR][nextC] += alpha;
        }
        map[row][col] = 0;
    }
 
}
cs

 

 

 

반응형

'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글

[backjoon]2048(easy)  (0) 2022.04.27
[backjoon]17822 원판 돌리기 java  (0) 2022.04.25
[backjoon]17144 미세먼지 안녕! java  (0) 2022.04.13
[backjoon]14500 테트로미노 java  (0) 2022.04.11
[beakjoon]7682 틱택토 java  (0) 2022.04.06