알고리즘/구현

[BOJ] 백준 5212 - 지구 온난화 풀이

송승현(SSH) 2022. 9. 13. 23:47

1. 문제

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

 

5212번: 지구 온난화

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

www.acmicpc.net

 

2. 풀이

백준에 구현으로 분류되어 있는 문제이다.
입력으로 R과 C가 주어지는데, 문제의 구문 중에서 "지도의 범위를 벗어나는 칸은 모두 바다이다."를 보고 입력 받을 배열의 행과 열을 2개씩 추가하여 배열을 만들었다. (R + 2, C + 2)

그리고 입력받은 .과 X를 배열에 넣어주고 반복문을 돌리면서 X 칸이면 cnt_sea()를 실행하여 인접한 세 칸 또는 네 칸이 바다인지를 판단한다. 세 칸 또는 네 칸이 바다라면 임시 결과 배열에 .를 넣고 아니라면 X를 넣는데, 이 때 섬을 포함하는 최소 배열을 출력으로 해야 하므로 배열을 출력하기 위한 minR, minC, maxR, maxC를 갱신해주면서 임시 결과 배열에서 X를 포함하는 최소 배열의 인덱스를 구한다.

탐색이 끝나면,  임시 결과 배열에서 갱신해주었던 minR, minC, maxR, maxC의 범위 만큼 배열을 출력해주면 정답!!!!

 

3. 소스 코드

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

public class Main {
    static String[][] map;
    static String[][] result;
    static int R, C;

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

    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());

        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        result = new String[R + 2][C + 2];

        map = new String[R + 2][C + 2];
        for (int i = 1; i <= R; i++) {
            String input = br.readLine();
            for (int j = 1; j <= C; j++) {
                map[i][j] = Character.toString(input.charAt(j - 1));
            }
        }

        for (int i = 0; i < R + 2; i++) {
            for (int j = 0; j < C + 2; j++) {
                if (i == 0 || i == R + 1) {
                    map[i][j] = ".";
                }
                else {
                    if (j == 0 || j == C + 1) {
                        map[i][j] = ".";
                    }
                }
            }
        }

        int minR = 12, minC = 12;
        int maxR = 0, maxC = 0;

        for (int i = 0; i < R + 2; i++) {
            for (int j = 0; j < C + 2; j++) {
                if (map[i][j].equals("X")) {
                    boolean flag = cnt_sea(i, j);
                    if (flag) {
                        result[i][j] = ".";
                    } else {
                        result[i][j] = "X";

                        minR = Math.min(minR, i);
                        minC = Math.min(minC, j);

                        maxR = Math.max(maxR, i);
                        maxC = Math.max(maxC, j);
                    }
                }
                else {
                    result[i][j] = ".";
                }
            }
        }

        for (int i = minR; i <= maxR; i++) {
            for (int j = minC; j <= maxC; j++) {
                bw.write(result[i][j]);
            }
            bw.write("\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }

    private static boolean cnt_sea(int x, int y) {
        int seaCnt = 0;
        for (int i = 0; i < 4; i++) {
            int xf = x + dx[i];
            int yf = y + dy[i];

            if (xf >= 0 && yf >= 0 && xf < R + 2 && yf < C + 2) {
                if (map[xf][yf].equals(".")) {
                    seaCnt += 1;
                }
            }
        }
        if (seaCnt >= 3) {
            return true;
        }
        else {
            return false;
        }
    }
}