기술 블로그

2573번 빙산 본문

알고리즘 문제/BOJ

2573번 빙산

parkit 2018. 10. 31. 01:20
728x90
반응형

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


DFS, dy + dx 활용 문제이다.


지구온난화가 발생하기 전에, isZero() 함수를 통해 전체 Map이 0인지 아닌지 검사를 하고,

연결 요소의 개수를 검사한다.


이후에 지구온난화가 발생하고, 그에 따른 높이가 낮아지게 된다.


예전에 푼 코드를 보니, 그 때에는 [303][303] 크기의 배열을 2개로 선언하여,

지구온난화가 발생했을 때, 이중 for문에서의 배열과, 0의 개수를 세는 for문에서의 배열을 다르게 하여

서로 영향을 미치지 않게 했다.


즉, 2와 4가 붙어있다고 했을 때, 2의 주변에 0의 개수가 2개라면, 0이 될 것이고, 

4의 주변에 0의 개수를 검사했을 때, 2가 0이 된 것을 포함시키면 안 된다.



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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
 
using namespace std;
 
int Map[303][303= { 0, };
 
int N = 0, M = 0;
 
bool visit[303][303= { false, };
 
int dy[4= { -1010 };
int dx[4= { 0-101 };
 
vector<int> v;
 
bool isZero()
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (Map[i][j] != 0return false;
        }
    }
 
    return true;
}
 
void DFS(int r, int c)
{
    visit[r][c] = true;
 
    for (int i = 0; i < 4; i++)
    {
        int y = r + dy[i];
        int x = c + dx[i];
 
        if (y < 0 || y >= N || x < 0 || x >= M || visit[y][x] || Map[y][x] == 0continue;
 
        DFS(y, x);
    }
}
 
void globalWarming(int r, int c)
{
    int Cnt = 0;
 
    for (int i = 0; i < 4; i++)
    {
        int y = r + dy[i];
        int x = c + dx[i];
 
        if (y < 0 || y >= N || x < 0 || x >= M || Map[y][x] != 0continue;
 
        if(Map[y][x] == 0++Cnt;
    }
 
    v.push_back(Cnt);
}
 
int main(void)
{
    memset(Map, 0sizeof(Map));
 
    bool Zero = false;
    int year = 0;
 
    scanf("%d %d"&N, &M);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%d"&Map[i][j]);
        }
    }
 
    while (1)
    {
        int Connected_Component = 0;
        if (!v.empty()) v.clear();
        memset(visit, falsesizeof(visit));
 
        if (isZero())
        {
            Zero = true;
            break;
        }
 
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                if (!visit[i][j] && Map[i][j] != 0)
                {
                    ++Connected_Component;
 
                    DFS(i, j);
                }
            }
        }
 
        if (Connected_Component >= 2break;
 
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                if (Map[i][j] != 0)
                {
                    globalWarming(i, j);
                }
            }
        }
 
        int index = 0;
 
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                if (Map[i][j] != 0)
                {
                    Map[i][j] -= v.at(index++);
 
                    if (Map[i][j] < 0) Map[i][j] = 0;
                }
            }
        }
 
        ++year;
    }
    
    if (Zero) printf("0\n");
    else printf("%d\n", year);
 
    return 0;
}
cs


728x90
반응형

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

1325번 효율적인 해킹  (0) 2018.11.04
14910번 오르막  (0) 2018.11.03
1032번 명령 프롬프트  (0) 2018.10.29
13300번 방 배정  (0) 2018.10.28
11758번 CCW  (0) 2018.10.28