[ BOJ / λ°±μ€ 5212 ] μ§κ΅¬ μ¨λν ( μλ° / JAVA )
https://www.acmicpc.net/problem/5212
5212λ²: μ§κ΅¬ μ¨λν
첫째 μ€μ μ§λμ ν¬κΈ° Rκ³Ό C (1 ≤ R, C ≤ 10)κ° μ£Όμ΄μ§λ€. λ€μ Rκ° μ€μλ νμ¬ μ§λκ° μ£Όμ΄μ§λ€.
www.acmicpc.net
λ¬Έμ μ€λͺ
R X C ν¬κΈ°μ μ§λμ, λ°λ€λ '.'λ‘, λ
μ 'X'λ‘ νκΈ°
50λ
ν, μΈμ ν μΈμΉΈ λλ λ€μΉΈμ΄ λ°λ€μΈ λ
μ, λ°λ€μ μ κΉ
50λ
νμ μ§λλ₯Ό 그리λλ°, μ§λμ ν¬κΈ°κ° λͺ¨λ μ¬μ ν¬ν¨νλ κ°μ₯ μμ μ§μ¬κ°ν
μ§λμ μλ κ³³, μ§λμ λ²μλ₯Ό λ²μ΄λλ κ³³μ λ°λ€
λ¬Έμ νμ΄
1. μ λ ₯
int[][] map
μ μ§λ μ μ₯, λ°λ€λ 0, λ
μ 1
2. μ κΈΈ λ νμΈ
mapμ λλ©΄μ, λ
μ΄λ©΄ findSeaCnt(x,y)
νΈμΆ
λ€λ©΄μ νμΈνλλ°, λ²μλ₯Ό λ²μ΄λλ λ°λ€λ‘ μΉ΄μ΄νΈint[][] aroundSea
μ μ μ₯
3. λ κ°λΌμνκΈ°
removeLand()
aroundSea
μ κ°μ΄ 3μ΄μμ΄λ©΄, λ°λ€(0)λ‘ κ° λ³κ²½
4. μ§λ μ€μ΄κΈ°
map
μ λλ©΄μ λ
μΈ λΆλΆμμ
minX, minY, maxX, maxY κ°λ€μ μ μ₯
map[minX][minY] ~ map[maxX][maxY] κ°λ€λ§ μΆλ ₯
μ½λ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_BOJ_5212_μ§κ΅¬_μ¨λν {
static int R, C, minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, maxX = -1, maxY = -1;
static int[][] map, aroundSea;
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
R = Integer.parseInt(stringTokenizer.nextToken());
C = Integer.parseInt(stringTokenizer.nextToken());
aroundSea = new int[R][C];
map = new int[R][C];
for (int i = 0; i < R; i++) {
char[] arr = br.readLine().toCharArray();
for (int j = 0; j < C; j++) {
map[i][j] = arr[j] == '.' ? 0 : 1;
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if(map[i][j] == 1) findSeaCnt(i, j);
}
}
removeLand();
makeMap();
/*System.out.println("minX : " + minX + " minY : " + minY +" maxX : " + maxX + " maxY : " + maxY);
for (int[] ma : map) {
for (int m : ma) {
System.out.print(m + " ");
}
System.out.println();
}*/
for (int i = minX; i <= maxX; i++) {
for (int j = minY; j <= maxY; j++) {
System.out.print(map[i][j] == 0 ? '.' : 'X');
}
System.out.println();
}
}
private static void makeMap() {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] == 1) {
minX = minX > i ? i : minX;
minY = minY > j ? j : minY;
maxX = maxX < i ? i : maxX;
maxY = maxY < j ? j : maxY;
}
}
}
}
private static void removeLand() {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (aroundSea[i][j] >= 3) {
map[i][j] = 0;
}
}
}
}
private static void findSeaCnt(int x, int y) {
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || R <= nx || C <= ny || map[nx][ny] == 0) aroundSea[x][y] += 1;
}
}
}