BOJ 5212 지구 온난화

2 minute read

  1. 변수

    char[][] map //주어지는 섬의 모양
    int[] line //출력할 영역 설정
    
  2. 로직

    • X일 경우 4방향 중에 2방향 이상이 X면 X으로 변경

    • 배열의 상하좌우 확인하면서 출력할 영역 설정하기

  3. 코드

package com.ssafy;

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

public class BOJ_5212_지구온난화_201229 {

	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];
		char[][] ans = new char[R][C];
		
		for (int i = 0; i < R; i++) {
			char[] c = br.readLine().toCharArray();
			map[i] = c;
		}
		
		for (int i = 0; i < ans.length; i++) {
			Arrays.fill(ans[i], '.');
		}
		
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if(map[i][j] == 'X')
					checkSea(i, j, map, ans);
			}
		}
		
		int[] line = removeLine(ans);
		
		for (int i = line[0]; i <= line[1]; i++) {
			for (int j = line[2]; j <= line[3]; j++) {
				System.out.print(ans[i][j]);
			}
			System.out.println();
		}

	}
	
	private static int[] removeLine(char[][] ans) {
		int[] line = new int[4];
		
		for (int i = 0; i < ans.length; i++) {
			boolean isSea = true;
			for (int j = 0; j < ans[i].length; j++) {
				if(ans[i][j] == 'X') {
					isSea = false;
					break;
				}
			}
			if(!isSea) {
				line[0] = i;
				break;
			}
		}
		
		for (int i = ans.length-1; i >= 0; i--) {
			boolean isSea = true;
			for (int j = 0; j < ans[i].length; j++) {
				if(ans[i][j] == 'X') {
					isSea = false;
					break;
				}
			}
			if(!isSea) {
				line[1] = i;
				break;
			}
		}
		
		for (int i = 0; i < ans[0].length; i++) {
			boolean isSea = true;
			for (int j = 0; j < ans.length; j++) {
				if(ans[j][i] == 'X') {
					isSea = false;
					break;
				}
			}
			if(!isSea) {
				line[2] = i;
				break;
			}
		}
		
		for (int i = ans[0].length -1 ; i >= 0; i--) {
			boolean isSea = true;
			for (int j = 0; j < ans.length; j++) {
				if(ans[j][i] == 'X') {
					isSea = false;
					break;
				}
			}
			if(!isSea) {
				line[3] = i;
				break;
			}
		}
		return line;
	}

	static int[] dr = {-1, 1, 0, 0};
	static int[] dc = {0, 0, -1, 1};

	private static void checkSea(int x, int y, char[][] map, char[][] ans) {
		int cnt = 0;
		for (int i = 0; i < dr.length; i++) {
			int nx = x + dr[i];
			int ny = y + dc[i];
			if(nx <0 || ny < 0 || nx >= map.length || ny >= map[nx].length) continue;
			if(map[nx][ny] == 'X')
				cnt++;
		}
		if(cnt > 1)
			ans[x][y] = 'X';
	}

}

Leave a comment