๊ธฐ๋ก๋ฐฉ

BOJ_14502 : ์—ฐ๊ตฌ์†Œ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_14502 : ์—ฐ๊ตฌ์†Œ

Soom_1n 2023. 3. 8. 23:10

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

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

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

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • N x M ์—ฐ๊ตฌ์†Œ ๊ฒฉ์ž ๋งต์— ๋นˆ ์นธ์€ 0, ๋ฒฝ์€ 1, ๋ฐ”์ด๋Ÿฌ์Šค๋Š” 2๋กœ ์ž…๋ ฅ๋œ๋‹ค.
    • ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ„๋‹ค.
    • ๋ฒฝ์„ 3๊ฐœ ์„ธ์›Œ์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋‹ค ํผ์ง„ ํ›„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋นˆ ์นธ์˜ ์ˆ˜ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • 3๊ฐœ์˜ ๋ฒฝ์„ ์„ค์น˜ํ•  ์œ„์น˜๋ฅผ ์กฐํ•ฉ์œผ๋กœ ๊ตฌํ•œ๋‹ค.
    • BFS๋กœ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.
    • 0์˜ ์ˆ˜๋ฅผ ์„ธ์„œ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    private static class Point {
        int r, c;

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

    private static int N, M, ans, cnt = -3;
    private static int[][] map, copy;
    private static Queue<Point> temp;
    private static ArrayList<Point> virus;
    private static int[] dr = {-1, 0, 1, 0};
    private static int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];
        copy = new int[N][M];
        virus = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                if (map[i][j] == 2)
                    virus.add(new Point(i, j));
                else if (map[i][j] == 0)
                    cnt++;
            }
        }

        // Combination
        comb(0, 0);

        // Output
        System.out.println(ans);
    }

    private static void comb(int cnt, int now) {
        if (cnt == 3) {
            ans = Math.max(ans, bfs());
            return;
        }

        for (int i = now; i < N * M; i++) {
            int r = i / M;
            int c = i % M;
            if (map[r][c] == 0) {
                map[r][c] = 1;
                comb(cnt + 1, i + 1);
                map[r][c] = 0;
            }
        }
    }

    private static int bfs() {
        deepCopy();

        temp = new ArrayDeque<>();
        for (Point p : virus) {
            temp.offer(p);
        }

        int add_virus = 0;
        while (!temp.isEmpty()) {
            Point point = temp.poll();

            for (int i = 0; i < dr.length; i++) {
                int r = point.r + dr[i];
                int c = point.c + dc[i];

                if (0<=r&&r<N&&0<=c&&c<M&&copy[r][c] == 0) {
                    copy[r][c] =2;
                    add_virus++;
                    temp.offer(new Point(r,c));
                }
            }
        }
        return cnt-add_virus;
    }

    private static void deepCopy() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                copy[i][j] = map[i][j];
            }
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ขŒํ‘œ๋ฅผ ๊ธฐ์–ตํžˆ๊ฐ€ ์œ„ํ•ด Point ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
  • N x M ์—ฐ๊ตฌ์‹ค ์ž…๋ ฅ๊ฐ’์„ 2์ฐจ์› ๋ฐฐ์—ด map์— ์ €์žฅํ•œ๋‹ค.
    • ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ ArrayListํ˜•์˜ virus์— ์ €์žฅํ•œ๋‹ค.
    • ๋นˆ ์นธ 0์˜ ์ด ๊ฐœ์ˆ˜ cnt๋„ ์ฒดํฌํ•ด๋‘”๋‹ค.
  • comb() ๋ฉ”์„œ๋“œ์—์„œ ์„ธ ๋ฒฝ์˜ ์œ„์น˜๋ฅผ ์กฐํ•ฉ์œผ๋กœ ์„ ํƒํ•œ๋‹ค.
    • now ๋ณ€์ˆ˜๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ ๋ชซ๊ณผ ๋‚˜๋จธ์ง€๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰๊ณผ ์—ด์— ์‚ฌ์šฉํ•œ๋‹ค.
    • map์˜ ๋ฒฝ์„ ์„ธ์šฐ๋Š” ์ขŒํ‘œ์— 1์„ ๋„ฃ๊ณ  comb๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœํ•œ๋‹ค.
    • ์žฌ๊ท€ ํ˜ธ์ถœ ํ›„์—๋Š” ๋‹ค์‹œ 0์„ ๋„ฃ์–ด ์›์ƒ๋ณต๊ตฌํ•œ๋‹ค.
    • ์„ธ์šด ๋ฒฝ์˜ ๊ฐœ์ˆ˜ cnt๊ฐ€ 3์ด ๋˜๋ฉด bfs() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , 0์˜ ์ตœ๋Œ€๊ฐ’ ans๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • bfs() ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š”๊ฑธ ๊ตฌํ˜„ํ•˜๊ณ  0์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • deepCopy()๋ฉ”์„œ๋“œ๋กœ ํ˜„์žฌ map์˜ ์ƒํƒœ๋ฅผ copy ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•œ๋‹ค.
    • ํ temp์— ๋ฐ”์ด๋Ÿฌ์Šค 2์˜ ์œ„์น˜๋“ค์„ ๋„ฃ๋Š”๋‹ค.
    • ํ temp๊ฐ€ ๋นŒ ๋•Œ ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ˆ˜(์‚ฌ๋ผ์ง„ 0์˜ ์ˆ˜)๋ฅผ ์ฒดํฌํ•œ๋‹ค.
      • ํ์— ๊ฐ’์„ ๊บผ๋‚ด ์ธ์ ‘ํ•œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋นˆ ์นธ์ด๋ผ๋ฉด 0์œผ๋กœ ๊ฐ’์„ ๋ฐ”๊พผ ๋’ค ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.
    • cnt์—์„œ add-virus๋ฅผ ๋บ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์กฐํ•ฉ๊ณผ BFS๋ฅผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.
  • comb() ๋ฉ”์„œ๋“œ์—์„œ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ ์ž for๋ฌธ ์กฐ๊ฑด์„ ์ž˜๋ชป ์ง€์ •ํ•ด์„œ 1ํšŒ ํ‹€๋ ธ๋‹ค.
    • ์กฐ๊ธˆ ์ค‘๋ณต์ด ์ผ์–ด๋‚˜๋”๋ผ๋„ ๋ฐ˜๋ก€๊ฐ€ ์—†๋Š” ํ™•์‹คํ•œ ์กฐ๊ฑด์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_5430 : AC  (0) 2023.03.28
BOJ_9019 : DSLR  (0) 2023.03.21
BOJ_1916 : ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ  (0) 2023.03.08
BOJ_1717 : ์ง‘ํ•ฉ์˜ ํ‘œํ˜„  (0) 2023.03.08
BOJ_1926 : ๊ทธ๋ฆผ  (0) 2023.03.05