Seren dev's blog
article thumbnail

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

풀이

r x c 크기의 지도를 입력받고, 인접한 4방향 중 3방향 이상이 바다라면 그 위치는 바다로 바꿔야 한다. 그 후 지도의 크기를 모든 섬을 포함하는 가장 작은 직사각형이 되도록 해야 한다.

일단 지도의 정보를 담는 배열과 50년 후 지도의 정보를 담는 배열을 따로 생성하여 50년 후 지도의 정보를 구하고, 그 후 변경된 지도의 크기를 구해야 한다.

 

로직

1. r과 c를 입력받는다.

2. String[] sea = new String[r]; 지도의 정보를 입력받는다.

3. char[][] ans = new char[r][c]; ans는 50년 후 지도의 정보를 담는다.

4. ra, rb, ca, cb는 각각 새로운 지도의 행 번호(첫 행번호와 끝 행번호)와 열 번호(첫 열번호와 끝 열번호)이다. 이후 ans배열을 구한 다음 ans의 행은 ra~rb, 열은 ca~cb까지 출력하면 된다.

5. 각 지도의 위치마다 다음을 수행한다.

  • 현재 위치가 땅이면(sea[i].charAt(j) == 'X'), 인접한 4방향 중 3방향 이상이 바다라면 50년 후 현재 위치(ans[i][j])는 바다가 되고, 아니라면 땅이다.
  • 현재 위치가 바다이면(sea[i].charAt(j) == '.'), 50년 후 현재 위치(ans[i][j])는 그대로 바다이다.
  • 50년 후 현재 위치가 땅이라면, ra, rb, ca, cb의 값을 업데이트 한다.

6. 행은 ra~rb, 열은 ca~cb까지 ans 배열을 출력한다.

 

코드

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

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

    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());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        
        String[] sea = new String[r];
        for (int i = 0; i < r; i++)
        	sea[i] = br.readLine();
        
        char[][] ans = new char[r][c];
        int ra = Integer.MAX_VALUE;
        int rb = Integer.MIN_VALUE;
        int ca = Integer.MAX_VALUE;
        int cb = Integer.MIN_VALUE;
        
        for (int i = 0; i < r; i++) {
        	for (int j = 0; j < c; j++) {
        		
        		if (sea[i].charAt(j) == 'X') {
        			int cnt = 0;
        			for (int k = 0; k < 4; k++) {
        				int nx = i + dx[k];
        				int ny = j + dy[k];
        				if (sea[i].charAt(j) == 'X') {
        					if (nx < 0 || nx >= r || ny < 0 || ny >= c) cnt++;
        					else if (sea[nx].charAt(ny) == '.')
        						cnt++;
        				}
        			}
        			
        			ans[i][j] = cnt >= 3 ? '.' : 'X';
        		}
        		else
        			ans[i][j] = '.';
        		
        		if (ans[i][j] == 'X') {
        			ra = Math.min(ra, i);
        			rb = Math.max(rb, i);
        			ca = Math.min(ca, j);
        			cb = Math.max(cb, j);
        		}
        	}
        }
        
        for (int i = ra; i <= rb; i++) {
        	for (int j = ca; j <= cb; j++)
        		bw.write(ans[i][j]);
        	bw.write("\n");
        }
        
        bw.flush();
        bw.close();
        br.close();

    }
}
728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!