본문 바로가기

알고리즘/BOJ

14502-연구소

정말 오랜만에 PS를 해봤다. 중간고사 때문에 그렇기도 하고, 그냥 내가 이 길을 걸을 능력이 있는지 하는 회의가 많이 들어서 그랬다. 결론은 공부도 안해놓고서 이길이 맞을까 하는건 의미 없다 생각해서, 그냥 다시 하기로 했다. 오랜만에 다시 하니까 확실히 재밌다. 그리고 뭔가 요즘은 과학/수학/컴퓨터 뽕이 차오르는 느낌이다.

뭔가 2학년 올라가니까 사회성이 필요한 경우가 많이 생기는데(동아리 회의 진행할땐 미치는 줄 알았다) 하다보면 늘겠지.. 발판삼아서 많이 성장했으면 좋겠다.

어차피 들어오는 사람 별로 없어서 그냥 의식의 흐름대로 써봤다. 

 

오늘 푼 문제는 14502번 연구소 이다.

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

 

14502번: 연구소

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

www.acmicpc.net

PS 쉬기전에 마지막으로 잡았던 문제였었는데, 잘 안풀렸었다. 근데 이번에 다시 풀어보니까 한 5분만에 풀었다.

 

#include <cstdio>
#include <vector>
int map[10][10], origin[10][10], visited[10][10], n, m, tmp, ans, d[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}, wallCnt;
std::vector<std::pair<int, int>> toWall;
std::vector<std::pair<int, int>> virus;

int max(int a, int b) {
    return (a>b)?a:b;
}

void calc(int x, int y) {
    if(x < 0 || x >= n || y < 0 || y >= m || map[x][y] == 1 || visited[x][y]) return;
    tmp++;
    visited[x][y] = true;
    for(int i = 0; i < 4; i++) {
        calc(x + d[i][0], y + d[i][1]);
    }
    return;
}

int main() {
    scanf("%d %d", &n, &m);
    for(int i  = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            scanf("%d", &origin[i][j]);
            if(origin[i][j] == 0) toWall.push_back(std::make_pair(i, j));
            else if(origin[i][j] == 2) virus.push_back(std::make_pair(i, j));
            else wallCnt++;
        }
    }
    for(int i = 0; i < toWall.size(); i++) {
        for(int j = i+1; j < toWall.size(); j++) {
            for(int l = j+1; l < toWall.size(); l++) {
                for(int x = 0; x < n; x++) {
                    for(int y = 0; y < m; y++) {
                        map[x][y] = origin[x][y];
                        visited[x][y] = false;
                    }
                }
                map[toWall[l].first][toWall[l].second] = 1;
                map[toWall[j].first][toWall[j].second] = 1;
                map[toWall[i].first][toWall[i].second] = 1;
                tmp = 0;
                for(int i = 0; i < virus.size(); i++) calc(virus[i].first, virus[i].second);
                tmp = n*m - wallCnt - tmp - 3;
                ans = max(ans, tmp);
            }
        }
    }
    printf("%d\n", ans);
}

브루트 포스다.

기본 맵을 입력 받고, 벽을 세울수 있는 모든 경우의수를 고려하면 된다.

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

Good Bye, BOJ 2021!  (0) 2021.12.31
boj 2747, 1182, 11729  (2) 2021.08.11
2252-줄 세우기  (0) 2021.05.20
10026-적록색약  (0) 2021.05.19
17978-Washer  (2) 2020.12.25
15682 - 삼차 방정식 풀기 2  (0) 2020.12.25
13705-Ax+Bsin(x)=C  (0) 2020.12.25
[Python]7420-맹독 방벽  (0) 2020.09.25