[5212] 지구 온난화

HeeSeong·2024년 10월 16일
0

백준

목록 보기
106/116
post-thumbnail

🔗 문제 링크

https://www.acmicpc.net/problem/5212


🔍 문제 설명


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

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

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

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

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

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


⚠️ 제한사항


  • 1 ≤ R, C ≤ 10



🗝 풀이 (언어 : Java)


단순 구현으로 풀었다. 50년 후의 지도를 만든다. 만드는 과정에서 섬의 위치는 행, 열 인덱스의 최대, 최소 값을 기록한다. 해당 최대, 최소 값의 사이즈만큼 50년 후의 지도를 복사하면 된다.

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

public class Main {

    private static final int[] dx = {-1, 0, 1, 0};
    private static final 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 row = Integer.parseInt(st.nextToken());
        int column = Integer.parseInt(st.nextToken());
        String[][] matrix = new String[row][column];
        for (int i = 0; i < row; i++) {
            String[] arr = br.readLine().split("");
            for (int j = 0; j < column; j++) {
                matrix[i][j] = arr[j];
            }
        }
        br.close();
        solution(matrix, row, column);
    }

    private static void solution(String[][] matrix, int row, int column) {
        String[][] fiftyMatrix = new String[row][column];
        int rowMin = row;
        int rowMax = 0;
        int colMin = column;
        int colMax = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                int count = 0;
                for (int k = 0; k < 4; k++) {
                    if (i + dx[k] < 0 || i + dx[k] >= row
                            || j + dy[k] < 0 || j + dy[k] >= column
                            || matrix[i + dx[k]][j + dy[k]].equals(".")) {
                        count++;
                    }
                }
                if (count >= 3 || matrix[i][j].equals(".")) {
                    fiftyMatrix[i][j] = ".";
                    continue;
                }
                fiftyMatrix[i][j] = "X";
                rowMin = Math.min(rowMin, i);
                rowMax = Math.max(rowMax, i);
                colMin = Math.min(colMin, j);
                colMax = Math.max(colMax, j);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = rowMin; i <= rowMax; i++) {
            for (int j = colMin; j <= colMax; j++) {
                sb.append(fiftyMatrix[i][j]);
            }
            sb.append('\n');
        }
        System.out.println(sb);
    }

}
profile
끊임없이 성장하고 싶은 개발자

0개의 댓글

관련 채용 정보