문제 풀이/백준

[백준] 5212번. 지구 온난화(JAVA)

27200 2025. 2. 6. 19:01

문제

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


풀이(14분)

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());

        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());

        char[][] map = new char[r][c];
        ArrayList<Point> list = new ArrayList<>();
        int minR = r;
        int minC = c;
        int maxR = 0;
        int maxC = 0;

        for(int i = 0; i < r; i++){
            String line = br.readLine();
            for(int j = 0; j < c; j++){
                map[i][j] = line.charAt(j);
                if(line.charAt(j) == 'X'){
                    list.add(new Point(i,j));
                }
            }
        }

        int[][] direction = new int[][]{
                {1,0},
                {-1,0},
                {0,1},
                {0,-1}
        };

        for(Point p : list){
            int curR = p.r;
            int curC = p.c;
            int check = 0;
            for(int i = 0; i < 4; i++){
                int nextR = curR + direction[i][0];
                int nextC = curC + direction[i][1];
                if(nextR >= 0 && nextR < r && nextC >= 0 && nextC < c){
                    if(map[nextR][nextC] == '.'){
                        check++;
                    }
                }else{
                    check++;
                }
            }
            if(check >= 3){
                map[curR][curC] = 'a';
            }
        }

        for(int i = 0; i < r; i++){
            for(int j = 0; j < c; j++){
                if(map[i][j] == 'X'){
                    minR = Math.min(minR, i);
                    minC = Math.min(minC, j);
                    maxR = Math.max(maxR, i);
                    maxC = Math.max(maxC, j);
                }
            }
        }

        for(int i = minR; i <= maxR; i++){
            for(int j = minC; j <= maxC; j++){
                if(map[i][j] != 'X'){
                    System.out.print('.');
                    continue;
                }
                System.out.print('X');
            }
            System.out.println();
        }

    }

    static class Point{
        int r, c;

        public Point(int r, int c){
            this.r = r;
            this.c = c;
        }
    }
}

 

문제 자체는 bfs도 아니고 dfs도 아닌 단순하게 list(어떤 자료구조든 가능)를 이용하여 원래 섬의 위치를 체크한다.

 

이후, 섬의 위치에만 검사를 하여 잠길지 아닌지 판단해 주면 되는 것이다.

 

주의할 점은 지도를 벗어나는 모든 위치가 바다라는 것이 포인트다. 즉, 이전과 동일하게 좌표 범위를 벗어나면 아무 동작을 하지 않는 것이 아닌 check++를 해주어야 한다는 것!!

 

마지막으로 tempMap 같이 원본과 복사된 맵을 사용하지 않았기에 섬 -> 바다가 되는 경우 '.'으로 해주는 것이 아닌 별도의 문자를 사용하였다.(최종적으로 출력할 때 구분하기 위함)

 

tempMap을 사용하지 않은 이유는 별도의 map을 만드는 것이 낭비라고 생각했기 때문이다.

마지막에 지도의 범위를 수정하기 위해 반복문을 한번 진행한 후에 최종 출력을 해주었다.