μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[ BOJ / λ°±μ€€ 5212 ] 지ꡬ μ˜¨λ‚œν™” ( μžλ°” / JAVA )

KIMHYEYUN 2022. 2. 15. 18:29
λ°˜μ‘ν˜•

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

 

5212번: 지ꡬ μ˜¨λ‚œν™”

첫째 쀄에 μ§€λ„μ˜ 크기 Rκ³Ό C (1 ≤ R, C ≤ 10)κ°€ μ£Όμ–΄μ§„λ‹€. λ‹€μŒ R개 μ€„μ—λŠ” ν˜„μž¬ 지도가 μ£Όμ–΄μ§„λ‹€.

www.acmicpc.net

문제 μ„€λͺ…

R X C 크기의 지도에, λ°”λ‹€λŠ” '.'둜, 땅은 'X'둜 ν‘œκΈ°
50λ…„ ν›„, μΈμ ‘ν•œ μ„ΈμΉΈ λ˜λŠ” 넀칸이 바닀인 땅은, 바닀에 μž κΉ€

50λ…„ ν›„μ˜ 지도λ₯Ό κ·Έλ¦¬λŠ”λ°, μ§€λ„μ˜ 크기가 λͺ¨λ“  섬을 ν¬ν•¨ν•˜λŠ” κ°€μž₯ μž‘μ€ μ§μ‚¬κ°ν˜•
지도에 μ—†λŠ” κ³³, μ§€λ„μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ” 곳은 λ°”λ‹€

문제 풀이

1. μž…λ ₯

int[][] map에 지도 μ €μž₯, λ°”λ‹€λŠ” 0, 땅은 1

2. 잠길 λ•… 확인

map을 λŒλ©΄μ„œ, 땅이면 findSeaCnt(x,y) 호좜
넀면을 ν™•μΈν•˜λŠ”λ°, λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ„ λ°”λ‹€λ‘œ 카운트
int[][] aroundSea에 μ €μž₯

3. λ•… κ°€λΌμ•‰νžˆκΈ°

removeLand()
aroundSea의 값이 3이상이면, λ°”λ‹€(0)둜 κ°’ λ³€κ²½

4. 지도 쀄이기

map을 λŒλ©΄μ„œ 땅인 λΆ€λΆ„μ—μ„œ
minX, minY, maxX, maxY 값듀을 μ €μž₯
map[minX][minY] ~ map[maxX][maxY] κ°’λ“€λ§Œ 좜λ ₯

μ½”λ“œ

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

public class Main_BOJ_5212_지ꡬ_μ˜¨λ‚œν™” {

    static int R, C, minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, maxX = -1, maxY = -1;
    static int[][] map, aroundSea;
    static int[] dx = {-1, 0, 0, 1};
    static int[] dy = {0, -1, 1, 0};

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

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

        aroundSea = new int[R][C];
        map = new int[R][C];
        for (int i = 0; i < R; i++) {
            char[] arr = br.readLine().toCharArray();
            for (int j = 0; j < C; j++) {
                map[i][j] = arr[j] == '.' ? 0 : 1;
            }
        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if(map[i][j] == 1) findSeaCnt(i, j);
            }
        }
        removeLand();
        makeMap();
        /*System.out.println("minX : " + minX + " minY : " + minY +" maxX : " + maxX + " maxY : " + maxY);

        for (int[] ma : map) {
            for (int m : ma) {
                System.out.print(m + " ");
            }
            System.out.println();
        }*/

        for (int i = minX; i <= maxX; i++) {
            for (int j = minY; j <= maxY; j++) {
                System.out.print(map[i][j] == 0 ? '.' : 'X');
            }
            System.out.println();
        }
    }

    private static void makeMap() {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == 1) {
                    minX = minX > i ? i : minX;
                    minY = minY > j ? j : minY;
                    maxX = maxX < i ? i : maxX;
                    maxY = maxY < j ? j : maxY;
                }
            }
        }
    }

    private static void removeLand() {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (aroundSea[i][j] >= 3) {
                    map[i][j] = 0;
                }
            }
        }
    }

    private static void findSeaCnt(int x, int y) {
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx < 0 || ny < 0 || R <= nx || C <= ny || map[nx][ny] == 0) aroundSea[x][y] += 1;
        }
    }
}
728x90
λ°˜μ‘ν˜•