Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

빠르게 핵심만

[백준 14502] 연구소 문제 풀이 본문

알고리즘

[백준 14502] 연구소 문제 풀이

빠르게 핵심만 2024. 4. 28. 17:03

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

접근

1. 재귀를 이용해서 3개의 벽을 세웁니다.

2. BFS 또는 DFS를 이용하여 바이러스를 퍼트립니다.

3. 안전 영역의 개수를 구합니다.

4. 안전 영역의 최댓값을 구합니다.

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

class Virus {
	int r, c;

	Virus(int r, int c) {
		this.r = r;
		this.c = c;
	}
}

public class Main {
	static int n, m, maxSafeArea;
	static int[][] map, nextMap;

	static int[] dr = { -1, 1, 0, 0 };
	static int[] dc = { 0, 0, -1, 1 };

	static ArrayList<Virus> viruses = 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());

		map = new int[n][m];
		nextMap = new int[n][m];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < m; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());

				// 바이러스의 위치를 저장한다.
				if (map[i][j] == 2) {
					viruses.add(new Virus(i, j));
				}
			}
		}

		setWall(0, 0);

		// 결과 출력
		System.out.println(maxSafeArea);
	}

	// 1. 3개의 벽을 세운다.
	static void setWall(int start, int count) {
		if (count == 3) {
			for (int i = 0; i < n; i++) {
				System.arraycopy(map[i], 0, nextMap[i], 0, m);
			}

			for (Virus virus : viruses) {
				spread(virus.r, virus.c);
			}

			maxSafeArea = Math.max(maxSafeArea, getSafeArea());
			return;
		}

		for (int i = start; i < n * m; i++) {
			int r = i / m;
			int c = i % m;
			if (map[r][c] == 0) {
				map[r][c] = 1;
				setWall(i + 1, count + 1);
				map[r][c] = 0;
			}
		}
	}

	// 2. 바이러스를 퍼트린다.
	static void spread(int r, int c) {
		for (int dir = 0; dir < 4; dir++) {
			int nr = r + dr[dir];
			int nc = c + dc[dir];
			if ((0 <= nr && nr < n && 0 <= nc && nc < m) && nextMap[nr][nc] == 0) {
				nextMap[nr][nc] = 2;
				spread(nr, nc);
			}
		}
	}

	// 3. 안전 영역의 개수를 구한다.
	static int getSafeArea() {
		int safeArea = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (nextMap[i][j] == 0) {
					safeArea++;
				}
			}
		}
		return safeArea;
	}
}

 

 

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

[백준 1546] 평균 Java 풀이  (0) 2024.05.13
[백준 11720] 숫자의 합 Java 풀이  (0) 2024.05.13
[백준 9024] 두 수의 합 Java 풀이  (1) 2024.04.23
[백준 2559] 수열 Java 풀이  (0) 2024.04.22
[백준 1940] 주몽 Java 풀이  (0) 2024.04.22