알고리즘 문제 풀이/BOJ

[backjoon]21610 마법사 상어와 비바라기 java

v 2021. 10. 1. 16:00

요청사항에 따라 구현하였다.

구현 중에 주의해야할 부분은 구름은 경계를 넘나들어서 나머지 연산을 이용하여 올바르게 값을 넣어주어야하고.

바로 직전에 구름이 있던 자리엔 구름이 생기면 안 되기에 이 점도 유의해줘야한다.

 

 

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
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.io.*;
import java.util.*;
 
class Main {
    static int N;
    static int[][] map;
    static ArrayList<Dot> cloud;//, ↙  ←, ↖, ↑, ↗, →, ↘, ↓
    static int[][] dirs = {{1-1}, {0-1}, {-1-1}, {-10}, {-11}, {01},{11}, {10}};
    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());
        int M = 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;
            }w
        }
        
        //비구름 최초 위치.
        cloud = new ArrayList<>();
        cloud.add(new Dot(N-10));
        cloud.add(new Dot(N-11));
        cloud.add(new Dot(N-20));
        cloud.add(new Dot(N-21));
        
        while(M-- >0) {
            st = new StringTokenizer(br.readLine());
            int d = Integer.parseInt(st.nextToken()) % 8;
            int s = Integer.parseInt(st.nextToken());
            
            //구름 이둉
            ArrayList<Dot> result = move(d, s);
            boolean[][] marked = new boolean[N][N];
            //구름 칸 비 내리기 + 1
            for(Dot dot : result) {
                map[dot.row][dot.col] += 1;
                marked[dot.row][dot.col]  = true;
            }
            //구름 칸에 물복사버그 : 대각선 방향으로 거리가 1인 칸에 물이 있는 바구니의 수 만큼 바구니의 물 양이 증가. 대각선 원형이 아니다.
            for(Dot dot : result) {
                
                int[] dirction = {0246};
                
                for(int i = 0; i < 4; i++) {
                    int curD = dirction[i];
                    int nextR = dot.row + dirs[curD][0];
                    int nextC = dot.col + dirs[curD][1];
                    
                    if(nextR< 0 || nextC < 0 || nextR >= N || nextC >= N) continue;
                    if(map[nextR][nextC] > 0) map[dot.row][dot.col]++;
                }
            }
            //구름 찾기.
            cloud = new ArrayList<>();
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if(map[i][j] < 2continue;
                    if(marked[i][j]) continue;
                    marked[i][j] = true;
                    cloud.add(new Dot(i, j));
                    map[i][j] -= 2;
                }
            }
 
        }
        int answer = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                answer += map[i][j];
            }
        }
        System.out.println(answer);
    }
    public static ArrayList<Dot> move(int d, int s) {
        ArrayList<Dot> result = new ArrayList<>();
        for(Dot cur : cloud) {
            int nextR = cur.row + dirs[d][0]*s;
            int nextC = cur.col + dirs[d][1]*s;
            
            nextR = (nextR + 100*N) % N;
            nextC = (nextC + 100*N) % N;
            result.add(new Dot(nextR, nextC));
        }
        return result;
    }
}
class Dot{
    int row;
    int col;
    Dot(int r, int c){
        this.row = r;
        this.col = c;
    }
}
 
 
 
 
cs
반응형

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

[backjoon]3055 탈출 java  (0) 2021.10.06
[backjoon]16927 배열돌리기2 java  (0) 2021.10.05
[backjoon]16236 아기상어 java  (0) 2021.09.30
[backjoon]16234 인구 이동 java  (0) 2021.09.26
[backjoon]12100 2048(easy) java  (0) 2021.09.15