https://www.acmicpc.net/problem/5212
풀이
r x c 크기의 지도를 입력받고, 인접한 4방향 중 3방향 이상이 바다라면 그 위치는 바다로 바꿔야 한다. 그 후 지도의 크기를 모든 섬을 포함하는 가장 작은 직사각형이 되도록 해야 한다.
일단 지도의 정보를 담는 배열과 50년 후 지도의 정보를 담는 배열을 따로 생성하여 50년 후 지도의 정보를 구하고, 그 후 변경된 지도의 크기를 구해야 한다.
로직
1. r과 c를 입력받는다.
2. String[] sea = new String[r]; 지도의 정보를 입력받는다.
3. char[][] ans = new char[r][c]; ans는 50년 후 지도의 정보를 담는다.
4. ra, rb, ca, cb는 각각 새로운 지도의 행 번호(첫 행번호와 끝 행번호)와 열 번호(첫 열번호와 끝 열번호)이다. 이후 ans배열을 구한 다음 ans의 행은 ra~rb, 열은 ca~cb까지 출력하면 된다.
5. 각 지도의 위치마다 다음을 수행한다.
- 현재 위치가 땅이면(sea[i].charAt(j) == 'X'), 인접한 4방향 중 3방향 이상이 바다라면 50년 후 현재 위치(ans[i][j])는 바다가 되고, 아니라면 땅이다.
- 현재 위치가 바다이면(sea[i].charAt(j) == '.'), 50년 후 현재 위치(ans[i][j])는 그대로 바다이다.
- 50년 후 현재 위치가 땅이라면, ra, rb, ca, cb의 값을 업데이트 한다.
6. 행은 ra~rb, 열은 ca~cb까지 ans 배열을 출력한다.
코드
import java.io.*;
import java.util.*;
public class Main {
static int[] dx = {0, 1, 0 ,-1};
static int[] dy = {1, 0, -1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
String[] sea = new String[r];
for (int i = 0; i < r; i++)
sea[i] = br.readLine();
char[][] ans = new char[r][c];
int ra = Integer.MAX_VALUE;
int rb = Integer.MIN_VALUE;
int ca = Integer.MAX_VALUE;
int cb = Integer.MIN_VALUE;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (sea[i].charAt(j) == 'X') {
int cnt = 0;
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if (sea[i].charAt(j) == 'X') {
if (nx < 0 || nx >= r || ny < 0 || ny >= c) cnt++;
else if (sea[nx].charAt(ny) == '.')
cnt++;
}
}
ans[i][j] = cnt >= 3 ? '.' : 'X';
}
else
ans[i][j] = '.';
if (ans[i][j] == 'X') {
ra = Math.min(ra, i);
rb = Math.max(rb, i);
ca = Math.min(ca, j);
cb = Math.max(cb, j);
}
}
}
for (int i = ra; i <= rb; i++) {
for (int j = ca; j <= cb; j++)
bw.write(ans[i][j]);
bw.write("\n");
}
bw.flush();
bw.close();
br.close();
}
}
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 9012번 : 괄호 - 자바[Java] (1) | 2022.09.24 |
---|---|
[백준] 2468번 : 안전영역 - 자바[Java] (0) | 2022.09.24 |
[백준] 20436번 : ZOAC 3 - 자바[Java] (0) | 2022.09.23 |
[백준] 1713번 : 후보 추천하기 - 자바[Java] (0) | 2022.09.21 |
[백준] 22858번 : 원상 복구 (small) - 자바[Java] (1) | 2022.09.21 |