• Baekjoon 5212 지구 온난화 JAVA

    2021. 12. 26.

    by. 순일

     

    5212번: 지구 온난화

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

    www.acmicpc.net

    문제

    해당 문제는 땅과 육지에 대한 map가 주어졌을 때 육지를 기준으로 인접한 칸이 3칸 이상 바다이면 해당 칸을 바다로 변경시키고 출력에서는 육지가 있는 최소한의 직사각형을 출력하는 문제다.

    풀이

    처음 입력 처리를 진행하고, 먼저 육지에 대해서 사방 탐색을 하면서 체크를 진행한다. 이때 배열 범위가 벗어나는 곳 또한 바다로 하여 카운트를 하고 해당하는 육지에 대해서만 큐에 넣어둔다. 이후 큐에서 하나씩 빼와서 육지를 바다로 변경시킨다. 마지막으로 출력 부분에서는 map에 육지인 값들을 탐색하면서 상하좌우 시작 끝점을 갱신해주고 이후 해당 상하좌우 값으로 반복문을 돌려서 map를 출력해주면 문제를 해결할 수 있다.

    코드
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	static int R, C;
    	static int dy[] = {-1,1,0,0}, dx[]= {0,0,-1,1};
    	static char map[][];
    	static boolean[][] visit;
    	static Queue<Node> q = new LinkedList<>();
    	public static void main(String[] args) throws Exception{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		R = Integer.parseInt(st.nextToken());
    		C = Integer.parseInt(st.nextToken());
    		
    		map = new char[R][C];
    		visit = new boolean[R][C];
    		for (int i = 0; i < R; i++) {
    			map[i] = br.readLine().toCharArray();
    		}
    		check();
    		change();
    		print();
    	}
    	
    	private static void print() { // 육지에 대해서 상하좌우값을 갱신하는 방식으로 map의 크기를 찾는다 이후 출력
    		int rmin = 10, rmax = 0, cmin = 10, cmax = 0;
    		for (int i = 0; i < R; i++) {
    			for (int j = 0; j < C; j++) {
    				if(map[i][j] == 'X') {
    					rmin = Math.min(rmin, i);
    					rmax = Math.max(rmax, i);
    					cmin = Math.min(cmin, j);
    					cmax = Math.max(cmax, j);
    				}
    			}
    		}
    		for (int i = rmin; i <=rmax; i++) {
    			for (int j = cmin; j <=cmax; j++) {
    				System.out.print(map[i][j]);
    			}
    			System.out.println();
    		}
    	}
    
    	private static void change() { // 변경 가능한 육지 체크했으면 다시 바다로 변경
    		while(!q.isEmpty()) {
    			Node n = q.poll();
    			map[n.y][n.x] = '.';
    		}
    	}
    	
    	private static void check() { // 육지에 대해서 4방탐색해서 바다 체크 배열 범위 벗어난곳도 바다
    		for (int i = 0; i < R; i++) {
    			for (int j = 0; j < C; j++) {
    				if(map[i][j] == 'X') {
    					int count = 0;
    					for (int k = 0; k < 4; k++) {
    						int ny = i + dy[k];
    						int nx = j + dx[k];
    						if(ny < 0 || nx < 0 || ny>= R || nx >= C) {
    							count++;
    							continue;
    						}
    						if(map[ny][nx] =='X')
    							continue;
    						count++;
    					}
    					if(count >= 3)
    						q.offer(new Node(i,j));
    				}
    			}
    		}
    	}
    	
    	static class Node{
    		int y,x;
    		Node(int y, int x){
    			this.y = y;
    			this.x = x;
    		}
    	}
    }

     

     

    GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드

    JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.

    github.com

     

    728x90

    '알고리즘 > Baekjoon' 카테고리의 다른 글

    Baekjoon 1743 음식물 피하기 JAVA  (0) 2021.12.28
    Baekjoon 10972 다음 순열 JAVA  (0) 2021.12.27
    Baekjoon 14716 현수막 JAVA  (0) 2021.12.25
    Baekjoon 20291 파일 정리 JAVA  (0) 2021.12.24
    Baekjoon 1269 대칭 차집합 JAVA  (0) 2021.12.16

    댓글