백준문제풀이/구현

17144번-미세먼지 안녕

반응형

문제

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net


접근방법

1) 접근 사고

특별한 알고리즘이 없지만 인덱스의 값 설정에 주의해서 풀어야 하는 문제였습니다. Spread, upper_move, Bottom_move 3가지 함수로 각 동작들을 정의하여 문제를 해결하였습니다.

 

2) 시간 복잡도

O(N^2)

 

3) 배운 점

람다식을 사용할때 캡쳐영역을 전체로 사용할 때 밖에 있는 변수와 이름이 같은 것을 사용하면 안된다는것을 알게 되었습니다. 만약 사용하게 되면 UB(Undefind Behavior)가 발생합니다.

 

4) PS

아니 UB 작동이 안되어야 하는거 아닌가??(컴파일러마다 작동이 될 수도 안 될수도.... 정의가 안 되어있기 때문에 모릅니다.)


정답 코드

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
/**
 * 1.미세먼지가 동서남북으로 확산된다(공기청정기가 있거나 범위 초가시 제외
 * 2.확산되는 미세먼지양은 A(r,c) / 5
 * 3.남은 미세먼지양은 A(r,c) - (A(r,c)/ 5) * (확산된 방향의 개수)
 *
 * 1.위쪽 공기청정기는 반시계 방ㅇ향
 * 2.아래쪽은 시계 방향
 * 3.공기청정기쪽으로 들어오는 미세먼지는 사라진다
 */
 
#include<bits/stdc++.h>
 
using namespace std;
 
const int MAX = 51;
int board[MAX][MAX];
int r, c, t;
 
int my[] = {-1010};
int mx[] = {010-1};
pair<intint> condi[2];
 
int main() {
    cin >> r >> c >> t;
    bool condiflag = true;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> board[i][j];
            if (condiflag && board[i][j] == -1) {
                condi[0= {i, j};
                condiflag = false;
            } else if (!condiflag && board[i][j] == -1) {
                condi[1= {i, j};
            }
        }
    }
 
    auto spread = [&](){
        int tmpboard[MAX][MAX];
        fill(&tmpboard[0][0], &tmpboard[MAX - 1][MAX - 1], 0);
        tmpboard[condi[0].first][condi[0].second] = -1;
        tmpboard[condi[1].first][condi[1].second] = -1;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (board[i][j] != -1) {
                    if (board[i][j] >= 5) {
                        int cnt = 0;
                        vector<pair<intint>> v;
                        for (int d = 0; d < 4; d++) {
                            int ny = i + my[d];
                            int nx = j + mx[d];
                            if (ny >= 0 && ny < r && nx >= 0 && nx < c && board[ny][nx] != -1) {
                                cnt++;
                                v.push_back({ny, nx});
                            }
                        }
 
                        for (int k = 0; k < v.size(); k++) {
                            tmpboard[v[k].first][v[k].second] += board[i][j] / 5;
                        }
                        tmpboard[i][j] += board[i][j] - ((board[i][j] / 5* cnt);
                    } else {
                        tmpboard[i][j] += board[i][j];
                    }
                }
            }
        }
        memcpy(board, tmpboard, sizeof(board));
    };
 
    auto upper_move = [&](){
        //좌
        int cy = condi[0].first;
        for(int i = cy - 1; i > 0; i--){
            board[i][0= board[i - 1][0];
        }
        for(int i = 0; i < c - 1; i++){
            board[0][i] = board[0][i + 1];
        }
 
        for(int i = 0; i < cy; i++){
            board[i][c - 1= board[i + 1][c - 1];
        }
        for(int i = c - 1; i > 1; i--){
            board[cy][i] = board[cy][i - 1];
        }
        board[cy][1= 0;
        return;
    };
 
    auto bottom_move = [&](){
        int cy = condi[1].first;
        int R = r - 1;
        int C = c - 1;
 
        for(int i = cy + 1; i < R; i++){
            board[i][0= board[i+1][0];
        }
        for(int i = 0; i < c; i++){
            board[R][i] = board[R][i + 1];
        }
        for(int i = R; i > cy; i--){
            board[i][C] = board[i - 1][C];
        }
        for(int i = C; i > 1; i--){
            board[cy][i] =board[cy][i - 1];
        }
        board[cy][1= 0;
    };
 
    for (int i = 0; i < t; i++) {
        spread();
        upper_move();
        bottom_move();
    }
 
    int sum = 0;
    for(int i =0; i < r; i++){
        for(int j =0; j <c; j++){
            if(board[i][j] != -1)
            sum += board[i][j];
        }
    }
    cout <<sum <<"\n";
}
cs
반응형

'백준문제풀이 > 구현' 카테고리의 다른 글

17140번-이차원 배열과 연산  (0) 2021.09.15
17143번-낚시왕  (0) 2021.09.15
16236번-아기상어  (0) 2021.09.14
16235번-나무재테크  (0) 2021.09.13
16234번-인구이동  (0) 2021.09.13