일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바
- LeetCode
- Python
- BFS
- java
- DFS
- 그레이들
- VIM
- git
- Redux
- 프로그래머스
- network
- DP
- CS
- 리트코드
- db
- 안드로이드
- TypeScript
- Data Structure
- 동적 계획법
- 알고리즘
- Database
- vscode
- react
- 다이나믹 프로그래밍
- Algorithm
- 백준
- frontend
- Javascript
- Graph
Archives
- Today
- Total
늘 겸손하게
백준 14502 - 연구소 ( Java ) 본문
Wrote by : besforyou
문제 풀이
1. 입력받기
N, M, 2차원 배열 값을 입력받아 저장합니다.
2. 벽을 세울 수 있는 모든 경우의 수 구하기
빈 칸 (0) 에 벽을 세울 수 있습니다. 벽을 세울 수 있는 모든 경우의 수를 구하여 배열에 저장합니다.
3. 벽을 세운 각 경우의 안전구역 구하기
벽을 세우고, 바이러스가 퍼진 후 안전구역을 구합니다.
4. 최대 안전구역 숫자 구하기
벽을 세울 수 있는 모든 경우 중에서 안전구역이 가장 큰 경우를 구하고 출력합니다.
코드
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
|
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int mat[][];
static ArrayList<Pair> zero_pos;
static ArrayList<Pair[]> wall_pos;
static int board[][];
static boolean visited[][];
static int dy [] = {-1, 1 , 0 , 0};
static int dx [] = {0, 0, -1, 1};
public static void main (String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
mat = new int[N][M];
board = new int[N][M];
visited = new boolean[N][M];
zero_pos = new ArrayList<>();
wall_pos = new ArrayList<>();
for (int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0 ; j < M ; j++) {
int number = Integer.parseInt(st.nextToken());
mat[i][j] = number;
if (number == 0) zero_pos.add(new Pair(i,j));
}
}
build_wall_pos();
int max = -1;
for (int i = 0 ; i < wall_pos.size() ; i++) {
Pair [] walls = wall_pos.get(i);
int temp = getSafeSpaceSize(walls);
max = Math.max(max, temp);
visited = new boolean[N][M];
}
System.out.print(max);
}
public static int getSafeSpaceSize(Pair [] walls) {
copyMatToBoard();
for (Pair p : walls) {
int y = p.y;
int x = p.x;
board[y][x] = 1;
}
spread_virus();
return count_safe_space();
}
public static int count_safe_space() {
int ans = 0;
for (int i = 0 ; i < N ; i++) {
for (int j = 0 ; j < M ; j++) {
if (board[i][j] == 0) ans += 1;
}
}
return ans;
}
public static void spread_virus() {
for (int i = 0 ; i < N ; i++) {
for (int j = 0 ; j < M ; j++) {
if (board[i][j] == 2 && visited[i][j] == false) {
BFS(new Pair(i,j));
visited[i][j] = true;
}
}
}
}
public static void BFS(Pair pair) {
Queue<Pair> queue = new LinkedList<>();
queue.add(pair);
while(!queue.isEmpty()) {
Pair p = queue.poll();
int y = p.y;
int x = p.x;
for (int i = 0 ; i < 4 ; i++) {
int new_y = y + dy[i];
int new_x = x + dx[i];
if (new_y < 0 || new_x < 0 || new_y >= N || new_x >= M) continue;
if (visited[new_y][new_x] == true || board[new_y][new_x] == 1) continue;
if (visited[new_y][new_x] == false && board[new_y][new_x] == 0) {
queue.add(new Pair(new_y, new_x));
visited[new_y][new_x] = true;
board[new_y][new_x] = 2;
}
}
}
}
public static void copyMatToBoard() {
for (int i = 0 ; i < N ; i++) {
for (int j = 0 ; j < M ; j++) {
board[i][j] = mat[i][j];
}
}
}
public static void build_wall_pos() {
int len = zero_pos.size();
for (int i = 0 ; i < len - 2; i++) {
for (int j = i + 1 ; j < len - 1 ; j++) {
for (int l = j + 1 ; l < len ; l++) {
Pair one = zero_pos.get(i);
Pair two = zero_pos.get(j);
Pair three = zero_pos.get(l);
Pair [] arr = {one, two, three};
wall_pos.add(arr);
}
}
}
}
}
class Pair {
int y, x;
Pair (int y, int x) {
this.y = y;
this.x = x;
}
}
|
cs |
'코딩 문제 > 백준' 카테고리의 다른 글
백준 9095 - 1, 2, 3 더하기 ( Java ) (0) | 2022.05.24 |
---|---|
백준 1003 - 피보나치 함수 ( Java ) (0) | 2022.05.23 |
백준 1991 - 트리 순회 (0) | 2022.02.20 |
백준 1929 - 소수 구하기 - 에라토스테네스의 체 ( Java ) (0) | 2022.02.18 |
백준 10815번 - 숫자 카드 ( Java ) (0) | 2022.02.17 |