2382 미생물 격리


가장 중요한 아이디어는 '군집이 모이는 경우를 어떻게 처리할 것인가?' 라고 생각한다.

나는 벡터를 이용하여 push 한 후 사이즈가 2 이상인경우를 군집이 뭉친 경우라고 정의하여 풀었다.


1. 여러군집이 모이는경우를 체크하기위해 100x100 벡터 Map을 만든다.


2. 군집을 이동시키고 Map에 기록 및 삭제한다.


3. 가장자리에 닿은 경우와 여러군집이 뭉친경우를 나누어 처리한다.


4. 남은 미생물 수를 출력한다.


5. Map을 초기화 시킨다.



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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
struct Node {
    int x;
    int y;
    int num;
    int dir;
};
 
int t, n, m, k;
int dx[] = { 0,-1,1,0,0 };
int dy[] = { 0,0,0,-1,1 };
vector<int> map[100][100];
 
int main() {
    ios_base::sync_with_stdio(false);
 
    cin >> t;
 
    for (int tc = 1; tc <= t; tc++) {
        cin >> n >> m >> k;
 
        vector<Node> v(k);
        for (int i = 0; i < k; i++) {
            cin >> v[i].x >> v[i].y >> v[i].num >> v[i].dir;
            v[i].dir;
            map[v[i].x][v[i].y].push_back(i);
        }
 
        while (m--) {
 
            // 군집 삭제
            for (int i = 0; i < k; i++) {
                if (v[i].num == 0continue;
                map[v[i].x][v[i].y].clear();
            }
 
            // 군집 이동
            for (int i = 0; i < k; i++) {
                if (v[i].num == 0continue;
                v[i].x += dx[v[i].dir];
                v[i].y += dy[v[i].dir];
                map[v[i].x][v[i].y].push_back(i);
            }
 
            for (int i = 0; i < k; i++) {
                if (v[i].num == 0continue;
 
                //가장자리에 닿은 경우
                if (v[i].x == 0 || v[i].y == 0 || v[i].x == n - 1 || v[i].y == n - 1) {
                    v[i].num = v[i].num / 2//미생물 1/2감소
                    //방향전환
                    if (v[i].dir == 1) v[i].dir = 2;
                    else if (v[i].dir == 2) v[i].dir = 1;
                    else if (v[i].dir == 3)v[i].dir = 4;
                    else v[i].dir = 3;
                }
                //여러 군집이 뭉친 경우
                else if (map[v[i].x][v[i].y].size() > 1) {
                    int x = v[i].x;
                    int y = v[i].y;
                    int max_num = 0;
                    int max_cnt = 0;
                    int max_dir = 0;
                    int sum = 0;
                    for (int i = 0; i < map[x][y].size(); i++) {
                        sum += v[map[x][y][i]].num; // 미생물 수 합
                        // 최대 미생물을 가진 군집 찾기
                        if (max_num < v[map[x][y][i]].num) {
                            max_num = v[map[x][y][i]].num;
                            max_dir = v[map[x][y][i]].dir;
                            max_cnt = map[x][y][i];
                        }
                        v[map[x][y][i]].num = 0;
                    }
                    v[max_cnt].num = sum;
                    v[max_cnt].dir = max_dir;
                }
            }
        }
 
        //남은 미생물 계산
        int res = 0;
        for (int i = 0; i < k; i++) {
            res += v[i].num;
        }
 
        //맵초기화
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                map[i][j].clear();
            }
        }
 
        cout << "#" << tc << " " << res << "\n";
    }
}
 
cs



'SWEA::문제풀이' 카테고리의 다른 글

4014 활주로 건설  (2) 2018.04.09
3304 최장 공통 부분 수열  (0) 2018.04.08
4013 특이한 자석  (0) 2018.03.26
4008 숫자 만들기  (0) 2018.03.22
4012 요리사  (2) 2018.03.17

+ Recent posts