[BOJ] 5212. 지구 온난화

Developer Log·2022년 3월 6일
0

Algorithm PS

목록 보기
75/76

문제


푸르고 아름다운 남해에는 많은 섬이 장관을 이루고 있다. 그림이 아니면 볼 수 없을 것 같은 아름다운 장관을 실제로 볼 수 있는 다도해로 상근이는 여행을 떠났다.

다도해에 도착한 상근이는 서울에서 보던 것과는 다른 풍경에 큰 충격을 받았다. 지구 온난화로 인해 해수면이 상승해 섬의 일부가 바다에 잠겨버렸다.

서울로 다시 돌아온 상근이는 이렇게 지구 온난화가 계속 될 경우 남해의 지도는 어떻게 바뀔지 궁금해졌다.

다도해의 지도는 R*C 크기의 그리드로 나타낼 수 있다. 'X'는 땅을 나타내고, '.'는 바다를 나타낸다.

50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨버린다는 사실을 알았다.

상근이는 50년 후 지도를 그려보기로 했다. 섬의 개수가 오늘날보다 적어질 것이기 때문에, 지도의 크기도 작아져야 한다. 지도의 크기는 모든 섬을 포함하는 가장 작은 직사각형이다. 50년이 지난 후에도 섬은 적어도 한 개 있다. 또, 지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다.

입력

첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.

출력

50년 후의 지도를 출력한다.

예제 입력 1

5 3
...
.X.
.X.
.X.
...

예제 출력 1

X

예제 입력 2

3 10
..........
..XXX.XXX.
XXX.......

예제 출력 2

.XX...X
XX.....

풀이


문제 유형 : 시뮬레이션


코드


import java.io.*;
import java.util.*;

public class Main_bj_5212_지구온난화 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int R = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		
		char[][] sea = new char[R+2][C+2];	// 범위가 벗어난 지역도 바다
		
		for(int i=1; i<=R; i++) {
			String s = br.readLine();
			for(int j=1; j<=C; j++) {
				sea[i][j] = s.charAt(j-1);
			}
		}
		
		// 4방 탐색
		int[] di = {-1, 0, 1, 0};
		int[] dj = {0, 1, 0, -1};
		
		int row[] = new int[2];		// 0: start index, 1 : end index
		int col[] = new int[2]; 	// 0: start index, 1 : end index
		col[0] = C+2; 				// 처음값을 가장 큰 값으로 초기화
		
		// 복사 코드
		char[][] tmpSea = new char[R+2][C+2];
		for(int i=0; i<+R+2; i++) {
			tmpSea[i] = Arrays.copyOf(sea[i], C+2);
		}
		
		for(int i=1; i<=R; i++) {
			for(int j=1; j<=C; j++) {
				if(sea[i][j]=='X') {
					
					// 3면 또는 4면이 바다인지 체크
					int cnt=0;
					for(int k=0; k<4; k++) {
						int ni = i+di[k];
						int nj = j+dj[k];
						
						if(ni<0 || ni>=R+2 || nj<0 || nj>C+2 || sea[ni][nj]=='X') continue;
						cnt++;
					}
					
					if(cnt>=3) {	// 3면 또는 4면이 바다
						tmpSea[i][j]='.';
					}
					else {			// 섬이라면					
						if(row[0]==0) {		// 시작값이 정해지지 않았다면
							row[0] = i;		// 시작값 지정
							row[1] = i;		// 섬이 한개일지도 모르니 끝값도 같이 지정
						}	
						else row[1] = i;	// 시작값이 정해져있다면 끝점을 갱신
							
						if(col[0]>j) col[0] = j;	// 시작값은 제일 작은 인덱스로
						if(col[1]<j) col[1] = j;	// 끝값은 제일 큰 인덱스로
					}
				}
			}
		}
		
		StringBuffer sb = new StringBuffer();
		for(int i=row[0]; i<=row[1]; i++) {
			for(int j=col[0]; j<=col[1]; j++) {
				sb.append(tmpSea[i][j]);
			}
			sb.append("\n");
		}
		
		System.out.println(sb.toString());
		br.close();
	}

}
profile
개발 공부 일지

0개의 댓글