공부하는 히욤이

[BOJ] 5212. 지구 온난화 본문

Algorithm/BaekJoon

[BOJ] 5212. 지구 온난화

히욤이 2019. 8. 22. 01:29

BaekJoon 5212. 지구 온난화

* 문제의 저작권은 BOJ 및 문제를 만든 사람에게 있습니다.

 

 

 

 

 

 

[문제 접근]

 

처음에는 BFS로 4방향을 돌아서 X가 2미만이면 좌표값을 .로 바꾸는 방법으로 했더니 .XXX. 일 경우 처음 X가 .으로 바뀌면서 현재 좌표의 양 옆 X개수도 바뀌기 때문에 전부 다 .....로 바뀌었다.

이걸 어떻게 따로 처리해야 할지 모르겠어서 int 배열을 만들어서 현재 좌표에서 4방향 X 개수를 세서 넣어주고

int배열에서 X가 2개 이상이면 원래 char 배열에 X값을 넣어주는 방법으로 조금 무식하게 풀었다.

그리고 X 좌표값들 중 제일 작은 값을 왼쪽 위, 왼쪽 아래 꼭지점 값으로 제일 큰 값을 오른쪽 위, 오른쪽 아래 꼭지점 값으로 해서 X를 포함하는 제일 작은 직사각형을 그렸다.

 

 

 

 

 

 

 

 

 

[코드]

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

public class Main_5212 {
	static int[] dx = {1, 0, -1, 0};
	static int[] dy = {0, -1, 0, 1};

	public static void main(String[] args) throws IOException {
		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[][] map = new char[R][C];

		for (int i = 0; i < R; i++) {
			String s = br.readLine();
			for (int j = 0; j < C; j++) {
				map[i][j] = s.charAt(j);
			}
		}


		int[][] nummap = new int[R][C];

		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				int cnt = 0;
				if (map[i][j] == 'X') {
					for (int k = 0; k < 4; k++) {
						int nx = i+ dx[k];
						int ny = j + dy[k];
						if (nx >= 0 && ny>=0 && nx <R && ny<C) {
							if (map[nx][ny] == 'X') {
								cnt+=1;
							}
						}
					}
				}
				nummap[i][j] = cnt;
			}
		}
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (nummap[i][j] < 2) {
					map[i][j] = '.';
				}
			}
		}
		
		int lx = Integer.MAX_VALUE;
		int ly = Integer.MAX_VALUE;
		int rx = Integer.MIN_VALUE;
		int ry = Integer.MIN_VALUE;
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (map[i][j] == 'X') {
					if (i < lx) {
						lx = i;
					}
					if (i > rx) {
						rx = i;
					}
					if (j <ly) {
						ly = j;
					}
					if (j > ry) {
						ry = j;
					}
				}
			}
		}

		for (int i = lx; i <= rx; i++) {
			for (int j = ly; j <= ry; j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
		
	}
}

'Algorithm > BaekJoon' 카테고리의 다른 글

[BOJ] 2606. 바이러스  (0) 2019.08.22
[BOJ] 2667. 단지번호붙이기  (0) 2019.08.22
[BOJ] 4949. 균형잡힌 세상  (0) 2019.08.04
[BOJ] 10828. 스택  (0) 2019.08.04
[BOJ] 10989. 수 정렬하기3  (0) 2019.08.03