알고리즘(Algorithm)/백준(Baekjoon)

[백준 Baekjoon] 5212번 지구 온난화 - JAVA

나아가는중 2021. 11. 17. 16:47
반응형

백준 Baekjoon 5212번 지구 온난화 - JAVA


문제 설명

입력받은 지도의 땅 주변의 바다의 수를 확인하여 3면이 바다인 경우 바다로 변경하고, 출력할 범위를 찾아 출력하면 되는 문제이다. 입력받은 지도에서 땅을 바다로 변경하는 경우 다른 땅의 주변 바다가 늘어나 별도의 배열을 만들어 사용해야 한다.

  1. 땅의 경우 주변 바다의 수를 검사 변경해야 하는 경우 변경
  2. 50년 후에도 땅인 경우 출력범위를 갱신
  3. 출력범위의 지도를 출력

소스 코드

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

public class Main {
    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++) {
            map[i] = br.readLine().toCharArray();
        }

        int[] di = {0, 1, 0, -1};
        int[] dj = {1, 0, -1, 0};

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

        char[][] after = new char[R][C]; // 50년 후
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == 'X') { // 땅인 경우
                    int cnt = 0; // 주변 바다 수
                    for (int k = 0; k < 4; k++) { // 4방향 탐색
                        int x = i + di[k];
                        int y = j + dj[k];

                        // 지도 밖인 경우에는 바다
                        if ((x == -1 || y == -1 || x == R || y == C) || map[x][y] == '.') {
                            cnt++;
                        }
                    }

                    if (cnt < 3) { // 3면 이하가 바다인 경우
                        after[i][j] = 'X';

                        minR = Math.min(minR, i); // 지도 출력 범위 갱신
                        minC = Math.min(minC, j);
                        maxR = Math.max(maxR, i);
                        maxC = Math.max(maxC, j);
                    } else {
                        after[i][j] = '.';
                    }
                } else {
                    after[i][j] = '.';
                }
            }
        }

        StringBuilder answer = new StringBuilder(); // 출력
        for (int i = minR; i <= maxR; i++) {
            for (int j = minC; j <= maxC; j++) {
                answer.append(after[i][j]);
            }
            answer.append("\n");
        }

        System.out.println(answer);
    }
}
반응형