백준문제풀이/구현

14502번-연구소

반응형

문제

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

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net


접근방법

1) 접근 사고

DFS + BFS 문제 였습니다.

알고리즘 과정은

1.입력값을 받고 난 board 배열에서 3개의 기둥을 설치한 뒤 

2.바이러스들이 모두 퍼집니다.(BFS 알고리즘 활용)

3.이후에 남은 공간을 측정하여 최대값일 경우 갱신합니다.

4.이때 DFS를 통해서 모든 경우를 구해주면 됩니다.

 

2) 시간 복잡도

모든 경우를 탐색해야 하므로 O(n^2)입니다.

 

3) 배운 점

무난했던 구현 문제였습니다.

 

4) PS

구현 잘해놓고 78번째 줄에서 m으로 적어야하는데 n으로 잘못적어서 시간낭비함... 논리 오류인줄 알았는데 다음부터는 조심해야겠다.


정답 코드

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
#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int,int>
#define mp(X,Y) make_pair(X,Y)
#define mt(X,Y) make_tuple(X,Y)
#define mtt(X,Y,Z) make_tuple(X,Y,Z)
#define ll long long
#define sz(v) (int)(v).size()
 
using namespace std;
const int MAX = 9;
int board[MAX][MAX];
int moveY[] = {-1,1,0,0};
int moveX[] = {0,0,-1,1};
int ret = INT_MIN;
int n, m;
 
int main(void)
{
    fastio;
 
    cin >> n >> m;
 
    for(int i =0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> board[i][j];
        }
    }
 
    auto BFS = [&]() -> int {
        queue<pair<int,int>> q;
        int tmpboard[MAX][MAX];
        memcpy(tmpboard, board, sizeof tmpboard);
 
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(tmpboard[i][j] == 2){
                    q.push({i,j});
                }
            }
        }
 
        while(!q.empty()){
            auto [y, x] = q.front();
            q.pop();
 
            for(int i = 0; i < 4; i++){
                int ny = y + moveY[i];
                int nx = x + moveX[i];
 
                if(ny < 0 || ny >= n || nx < 0 || nx >= m)
                    continue;
                if(tmpboard[ny][nx] == 0){
                    q.push({ny, nx});
                    tmpboard[ny][nx] = 2;
                }
            }
        }
 
        int cnt = 0;
        for(int i = 0; i < n ; i++){
            for(int j = 0; j < m; j++){
                if(tmpboard[i][j] == 0)
                    cnt++;
            }
        }
        return cnt;
    };
 
    auto DFS =[&](int cnt, auto&& DFS) -> void {
        if(cnt == 3)
        {
            ret = max(ret, BFS());
            return ;
        }
 
        for(int i = 0; i < n ; i++){
            for(int j = 0; j < m; j++){
                if(board[i][j] == 0)
                {
                    board[i][j] = 1;
                    DFS(cnt + 1, DFS);
                    board[i][j] = 0;
                }
            }
        }
    };
 
    DFS(0, DFS);
    cout <<  ret << "\n";
}
 
cs
반응형

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

14890번-경사로  (0) 2021.09.04
14503번-로봇청소기  (0) 2021.09.04
14500번-테트로미노  (0) 2021.09.03
14499-주사위굴리기  (0) 2021.09.03
13458번-시험감독  (0) 2021.09.02