알고리즘 문제 풀이/BOJ

[backjoon]17144 미세먼지 안녕! java

v 2022. 4. 13. 16:00

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

문제에서 요구하는 것은 2가지. 먼지 퍼지기랑 공기 순환

1. 먼지 퍼지기

- 전체 다 파악하면서 먼지를 퍼지게 해준다.

- 주의할 점은 원래 미세먼지가 있는 곳과 미세먼지가 새로 생기는 곳을 분리하지 않으면 값이 엉킬수가 있어서 추가로 더해지는 배열을 만들어서 마지막에 합쳐준다.

- 미세먼지가 퍼지거나 배열을 마지막메 합쳐주고, 새로 만들어주는 과정에서 절대절대 공기청정기를 잘 생각해줘야한다. 구현방법에 따라 마지막에 +2 해줘서 구할 수도 있지만, 일단 나는 미연에 방지하였다.

2. 공기 순환

- 위에는 반시계방향, 아래는 시계방향으로 돌려주면 된다!

- 공기 청정기 방향은 변하지 않는 것도 주의!! 공기청정기가 1열에 고정되어있어서 구현이 한결 쉬웠다!

 

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
import java.io.*;
import java.util.*;
/**
 */
public class Main {
    static int R, C, T;
    static int[][] dirs = { { 10 }, { -10 }, { 01 }, { 0-1 } };
    static int[][] map, marchine, result;
    static boolean[][] marked;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        T = Integer.parseInt(st.nextToken());
        map = new int[R][C];
        result = new int[R][C];
        marchine = new int[2][2];
        marked = new boolean[R][C];
        int idx = 0;
        for (int i = 0; i < R; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < C; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                if (map[i][j] == -1)
                    marchine[idx++= new int[] { i, j };
            }
        }
        
        while (T-- > 0) {
            spread();
            airconditioner();
            map[marchine[0][0]][marchine[0][1]] = -1;
            map[marchine[1][0]][marchine[1][1]] = -1;
        }
        
        int answer = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] > 0) {
                    answer += map[i][j];
                }
            }
        }
        System.out.println(answer);
    }
    
    // << 공기 청정기의 작동 >>
    private static void airconditioner() {
        // 반시계방향.
        int[] top = marchine[0];
        map[top[0]][1= 0;
        // ->
        for (int i = 2; i < C; i++) {
            map[top[0]][i] = result[top[0]][i - 1];
        }
        // ^
        for (int i = top[0]; i > 0; i--) {
            map[i -1][C - 1= result[i][C - 1];
        }
        // <-
        for (int i = C - 2; i >= 0; i--) {
            map[0][i] = result[0][i + 1];
        }
        // v
        for (int i = 1; i < top[0]; i++) {
            map[i][0= result[i - 1][0];
        }
        // 시계 방향
        int[] bottom = marchine[1];
        map[bottom[0]][1= 0;
        // ->
        for (int i = 2; i < C; i++) {
            map[bottom[0]][i] = result[bottom[0]][i - 1];
        }
        // v
        for (int i = bottom[0]; i < R - 1; i++) {
            map[i + 1][C - 1= result[i][C - 1];
        }
        // <-
        for (int i = C - 1; i > 0; i--) {
            map[R - 1][i - 1= result[R - 1][i];
        }
        // ^
        for (int i = R - 1; i >= bottom[0]; i--) {
            map[i - 1][0= result[i][0];
        }
    }
    // << 미세먼지의 확산 >>
    private static void spread() {
        result = new int[R][C];
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                int cur = map[i][j];
                if (cur == 0)
                    continue;
                cur /= 5;
                int cnt = 0;
                for (int d = 0; d < 4; d++) {
                    int nextR = i + dirs[d][0];
                    int nextC = j + dirs[d][1];
                    if (nextR < 0 || nextC < 0 || nextR >= R || nextC >= C)
                        continue;
                    if (nextR == marchine[0][0&& nextC == marchine[0][1])
                        continue;
                    if (nextR == marchine[1][0&& nextC == marchine[1][1])
                        continue;
                    result[nextR][nextC] += cur;
                    cnt++;
                }
                cur = map[i][j] - map[i][j] / 5 * cnt;
                result[i][j] += cur;
            }
        }
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (result[i][j] < 0)
                    result[i][j] = 0;
                if (i == marchine[0][0&& j == marchine[0][1])
                    result[i][j] = -1;
                if (i == marchine[1][0&& j == marchine[1][1])
                    result[i][j] = -1;
                map[i][j] = result[i][j];
            }
        }
    }
}
cs
반응형