danbibibi
article thumbnail

1. 문제

문제 바로가기> BOJ 14502번: 연구소

 

14502번: 연구소

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

www.acmicpc.net

 

2. 풀이

벽 3개를 놓을 수 있는 모든 조합의 경우를 고려해서, 안전 영역의 최대 크기를 구해 주면 된다!

 

2.0.1. C++

<cpp />
#include<iostream> #include<vector> #define MAX 9 #define EMPTY 0 #define WALL 1 #define VIRUS 2 using namespace std; int N, M; int ans = 0; int lab[MAX][MAX]; int copy_lab[MAX][MAX]; int dy[] = { -1,1,0,0 }; int dx[] = { 0,0,-1,1 }; vector<pair<int, int>> virus; void input() { cin >> N >> M; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> lab[i][j]; if(lab[i][j] == VIRUS) virus.push_back({i, j}); } } } void spread_virus(int y, int x) { copy_lab[y][x] = VIRUS; for (int d = 0; d < 4; d++) { int ny = y + dy[d]; int nx = x + dx[d]; if (ny < 0 || ny >= N || nx < 0 || nx >= M) continue; if (copy_lab[ny][nx] != EMPTY) continue; spread_virus(ny, nx); } } void solution(int cnt) { if (cnt == 3) { // 1. copy map for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) copy_lab[i][j] = lab[i][j]; } // 2. spread_virus for (int i = 0; i < virus.size(); i++) { spread_virus(virus[i].first, virus[i].second); } // 3. get max safety zone int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if(copy_lab[i][j] == EMPTY) res++; } } // 4. update ans; ans = max(ans, res); return; } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (lab[i][j] != EMPTY) continue; lab[i][j] = WALL; solution(cnt + 1); lab[i][j] = EMPTY; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); input(); solution(0); cout << ans; }

 

2.0.2. Java

<java />
import java.io.*; import java.util.*; public class Main { static final int EMPTY = 0; static final int WALL = 1; static final int VIRUS = 2; static int N, M, ans = 0; static int[][] lab, copy_lab; static final int[] dy = { -1,1,0,0 }; static final int[] dx = { 0,0,-1,1 }; static List<int[]> virus = new ArrayList<>(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); lab = new int[N][M]; copy_lab = new int[N][M]; for(int i=0; i<N; i++) { st = new StringTokenizer(br.readLine()); for(int j=0; j<M; j++) { lab[i][j] = Integer.parseInt(st.nextToken()); if(lab[i][j] == VIRUS) virus.add(new int[]{i, j}); } } solution(0); System.out.println(ans); } private static void spread_virus(int y, int x) { copy_lab[y][x] = VIRUS; for (int d = 0; d < 4; d++) { int ny = y + dy[d]; int nx = x + dx[d]; if (ny < 0 || ny >= N || nx < 0 || nx >= M) continue; if (copy_lab[ny][nx] != EMPTY) continue; spread_virus(ny, nx); } } public static void solution(int cnt) { if (cnt == 3) { // 1. copy map for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) copy_lab[i][j] = lab[i][j]; } // 2. spread_virus for (int i = 0; i < virus.size(); i++) { spread_virus(virus.get(i)[0], virus.get(i)[1]); } // 3. get max safety zone int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if(copy_lab[i][j] == EMPTY) res++; } } // 4. update ans; ans = Math.max(ans, res); return; } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (lab[i][j] != EMPTY) continue; lab[i][j] = WALL; solution(cnt + 1); lab[i][j] = EMPTY; } } } }

'문제 풀이 > SW 역량 테스트' 카테고리의 다른 글

BOJ 17143번: 낚시왕  (0) 2023.01.15
BOJ 17144번: 미세먼지 안녕!  (0) 2023.01.12
BOJ 14889번: 스타트와 링크  (0) 2023.01.11
BOJ 15686번: 치킨 배달  (0) 2023.01.10
BOJ 14888번: 연산자 끼워넣기  (0) 2023.01.09
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로