๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 14502๋ฒˆ ์—ฐ๊ตฌ์†Œ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 8. 3.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ ๋ฐฑ์ค€ 14502๋ฒˆ ์—ฐ๊ตฌ์†Œ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

14502๋ฒˆ: ์—ฐ๊ตฌ์†Œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ํฌ

www.acmicpc.net

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

 

๋ฌธ์ œ ์ ‘๊ทผ

 

์ด ๋ฌธ์ œ๋Š” DFS์™€ BFS ๋ฅผ ๋ชจ๋‘ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธํ•˜๋‹ค.

 

๋ฒฝ์„ ์„ธ์šฐ๋Š” ๊ฒƒ์„ DFS ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฌ๋Š” ๊ฒƒ์„ BFS ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ •๋‹ต ์ฝ”๋“œ

public class Main {

    private static int n;
    private static int m;
    private static int[][] arr;
    private static int[][] temp;
    private static int answer = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] nm = br.readLine().split(" ");

        n = Integer.parseInt(nm[0]); // y
        m = Integer.parseInt(nm[1]); // x

        arr = new int[n][m];
        temp = new int[n][m];

        for (int i = 0; i < n; i++) {
            String[] s = br.readLine().split(" ");

            for (int j = 0; j < s.length; j++) {
                arr[i][j] = Integer.parseInt(s[j]);
            }
        }

        // ๋ฐ˜๋ณต ๋Œ๋ฉด์„œ setWall() ํ•จ์ˆ˜ ํ˜ธ์ถœ

        // bfs ๋กœ ๋ฐ”์ด๋Ÿฌ์Šค ํผํŠธ๋ฆฌ๊ธฐ
        setWall(0);

        bw.write(String.valueOf(answer));
        bw.flush();
        bw.close();
    }

    private static void setWall(int depth) {
        if(depth == 3) {
            spread();
            return;
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if(arr[i][j] == 0) {
                    arr[i][j] = 1;
                    setWall(depth + 1);
                    arr[i][j] = 0;
                }
            }
        }
    }

    private static void spread() {


        Queue<Position> queue = new LinkedList<>();

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                temp[i][j] = arr[i][j];
            }
        }

        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp[i].length; j++) {
                if (temp[i][j] == 2) {
                    queue.add(new Position(j, i));
                }
            }
        }

        int[] xPos = {1, -1, 0, 0};
        int[] yPos = {0, 0, 1, -1};


        while(!queue.isEmpty()) {
            Position front = queue.remove();

            for (int i = 0; i < 4; i++) {
                int xx = front.x + xPos[i];
                int yy = front.y + yPos[i];

                if(0 <= xx && xx < m && 0 <= yy && yy < n) {
                    if (temp[yy][xx] == 0) {
                         temp[yy][xx] = 2;
                         queue.add(new Position(xx, yy));
                    }
                }
            }
        }

        answer = Math.max(answer, countSafetyZone());
    }

    private static int countSafetyZone() {
        int count = 0;

        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp[i].length; j++) {
                if(temp[i][j] == 0) count++;
            }
        }
        return count;
    }

    private static class Position {
        int x;
        int y;
        public Position(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

}

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€