계단을 오르듯이

[JAVA] 백준 16918. 붐버맨 본문

알고리즘/백준_JAVA

[JAVA] 백준 16918. 붐버맨

happyAyun 2022. 1. 19. 08:02

해당 폭탄이 터지기 전에 1초의 간격으로 모든 곳에 폭탄을 설치할 시간이 주어진다.

현재 시작을 1초로 하므로, 짝수의 시간에는 모든 곳에 폭탄이 설치된 배열이 정답이 된다.

홀수일 경우, 이제 계산을 해야주어야 하는데 이중 for문을 이용했다.

순서대로 배열의 값을 확인해 폭탄의 위치가 아닐 시 폭탄으로 바꿔주고, 폭탄일 시 폭탄의 연산을 해준다. 여기서 이미 폭탄의 영향으로 바뀌어진 부분을 다시 바꾸어줄 수 있는 영향이 존재하므로 방문처리를 해주었다.

폭탄의 연산에서는 방문처리에 상관없이 폭탄의 연산을 해주었고, 전체 폭탄은 동시에 터지는 것을 원칙으로 하기에 4방향으로 폭발할 때의 계산을 하기 전 그 위치가 다음 연산에 영향을 주는 오른쪽과 아래의 위치가 되어질 때는 그 부분을 if문을 통해 제외하여 다음 연산에 영향을 주지 않도록 하였다.

 

 

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
package january.second;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class B_16918_봄버맨 {
 
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(in.readLine());
        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        char[][] arr = new char[R][C];
        for (int i = 0; i < R; i++) {
            String str = in.readLine();
            for (int j = 0; j < C; j++) {
                arr[i][j] = str.charAt(j);
            }
        }
        if (N % 2 == 0) { // 짝수의 시간은 무조건 모든 배열에 폭탄이 위치
            for (int i = 0; i < R; i++) {
                for (int j = 0; j < C; j++) {
                    sb.append('O');
                }
                sb.append("\n");
            }
        } else {
            for (int t = 1; t < N; t += 2) { // 폭탄 설치를 제외한 시간 간격 +2
                boolean[][] visited = new boolean[R][C]; // 이미 폭탄으로 바뀐 부분을 다시 바뀌지 않게 하기 위한 방문처리
                for (int i = 0; i < R; i++) {
                    for (int j = 0; j < C; j++) {
                        if (visited[i][j])
                            continue;
                        if (arr[i][j] == '.') {
                            arr[i][j] = 'O';
                        } else {
                            arr[i][j] = '.';
                            boom(i, j, arr, visited);
                        }
                        visited[i][j] = true;
                    }
                }
            }
            for (int i = 0; i < R; i++) {
                for (int j = 0; j < C; j++) {
                    sb.append(arr[i][j]);
                }
                sb.append("\n");
            }
        }
 
        System.out.println(sb);
    }
 
    private static void boom(int y, int x, char[][] arr, boolean[][] visited) {
        int[][] dir = { { -10 }, { 10 }, { 0-1 }, { 01 } };
        int r = arr.length;
        int c = arr[0].length;
        for (int d = 0; d < 4; d++) {
            int my = y + dir[d][0];
            int mx = x + dir[d][1];
            if (my < 0 || mx < 0 || my >= r || mx >= c)
                continue;
            if ((d == 3 || d == 1&& arr[my][mx] == 'O'// 다음 순서에 폭탄이 있는 경우를 제외
                // 순서는 오른쪽 아래로 움직이므로(이중for문) -> 폭탄을 기준으로 오른쪽과 아래쪽 배열의 위치
                continue;
            visited[my][mx] = true;
            arr[my][mx] = '.';
        }
    }
}
 
cs

'알고리즘 > 백준_JAVA' 카테고리의 다른 글

[JAVA] 2164. 카드 2  (0) 2022.01.26
[JAVA] 14620. 꽃길  (0) 2022.01.21
2512. 예산  (0) 2022.01.10
1520. 내리막 길  (0) 2022.01.10
1431. 시리얼 번호  (0) 2022.01.09