๊ธฐ๋ก๋ฐฉ

BOJ_1915 : ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1915 : ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

Soom_1n 2024. 5. 11. 21:15

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



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

  • n * m ๋ฐฐ์—ด์—์„œ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • ๋จผ์ € Brute Force๋กœ ํ’€์ด ์‹œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณด์•˜๋‹ค.
    • ์ •์‚ฌ๊ฐํ˜•์˜ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์„ ์ฐพ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„๋•Œ, ํ•œ ์ ์„ ์ฐ๊ณ  ์ตœ๋Œ€๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.
    • ์‹ค์ œ๋กœ๋Š” ์ตœ๋Œ€๋กœ ๊ทธ๋ ค์ง€๋Š” ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•ด์„œ ๋” ๊ฑธ๋ฆฌ๊ฒ ์ง€๋งŒ,
      ๊ทธ๋ ค์ง€๋Š” ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ k๋ผ๊ณ  ํ–ˆ์„ ๋•Œ,์–ด๋ฆผ์žก์•„์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n*m*k*k)์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ 1,000 ^ 4 = 1์กฐ๋กœ ์‹œ๊ฐ„ ์ œํ•œ์ธ 1์ดˆ๋ฅผ ๊ฐ€๋ฟํžˆ ๋„˜๊ฒŒ ๋œ๋‹ค.
  • 2์ฐจ์› ๋ฐฐ์—ด ํ˜•์‹์—์„œ ํšจ์œจ์„ ๋†’์ด๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—ฌ์„œ DP๋ฅผ ์˜์‹ฌํ•˜๊ณ  ์ ํ™”์‹์„ ์ฐพ๊ธฐ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋‹ค.
    • ๋ช…์พŒํ•œ ์ ํ™”์‹ ๋Œ€์‹  ์†์œผ๋กœ ์ ์–ด๋ณด๋ฉฐ row, col ํ•ฉ๋ฐฐ์—ด์„ ๋งŒ๋“  ๋’ค dp ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ํ˜•์‹์œผ๋กœ ์–ด๋–ป๊ฒŒ๋“  ํ’€์–ด๋ƒˆ๋‹ค.
    • ์ •๋‹ต์„ ๋งž์€ ๋’ค์— gpt๋ฅผ ํ†ตํ•ด ์ ํ™”์‹์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์•˜๋Š”๋ฐ, ๊ทธ๋ƒฅ ํ˜„์žฌ ์ธ๋ฑ์Šค์˜ ์™ผ์ชฝ, ์œ„์ชฝ, ์™ผ์ชฝ์œ„ ๋Œ€๊ฐ์„  ์„ธ ์ธ๋ฑ์Šค ๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ’์— +1 ํ•˜๋ฉด ๋˜๋Š” ํ˜•์‹์ด์—ˆ๋‹ค.

๐Ÿ”ธ ๊ธฐ์กด ํ’€์ด ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[][] arr = new int[n + 1][m + 1];
        int[][] rowSeq = new int[n + 1][m + 1];
        int[][] colSeq = new int[n + 1][m + 1];
        int[][] square = new int[n + 1][m + 1];

        for (int i = 1; i <= n; i++) {
            char[] chars = br.readLine().toCharArray();
            for (int j = 1; j <= m; j++) {
                arr[i][j] = Character.getNumericValue(chars[j - 1]);
            }
        }

        // Row fill
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (arr[i][j] == 1) {
                    rowSeq[i][j] = rowSeq[i][j - 1] + 1;
                }
            }
        }

        // Col fill
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (arr[j][i] == 1) {
                    colSeq[j][i] = colSeq[j - 1][i] + 1;
                }
            }
        }

        // Square fill
        int max = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (arr[i][j] == 0)
                    continue;

                int min = Math.min(rowSeq[i][j], colSeq[i][j]); // ๊ฐ€๋กœ์„ธ๋กœ ์—ฐ์† min๊ฐœ ์žˆ์Œ
                if (square[i - 1][j - 1] >= min - 1) { // ์ขŒ์ƒ๋‹จ ๋Œ€๊ฐ์„ ์— min-1 ํฌ๊ธฐ ์ •์‚ฌ๊ฐํ˜• ์žˆ์Œ
                    square[i][j] = min;
                } else if (square[i - 1][j - 1] + 1 <= min) {
                    square[i][j] = square[i - 1][j - 1] + 1;
                } else {
                    square[i][j] = 1;
                }
                max = Math.max(max, square[i][j]);
            }
        }

        // Output
        bw.write(Integer.toString(max * max));
        bw.flush();
    }
}

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

  • arr ๋ฐฐ์—ด์— ์ž…๋ ฅ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , rowSeq ์™€ colSeq์— ๊ฐ€๋กœ ์˜ค๋ฅธ์ชฝ, ์„ธ๋กœ ์•„๋ž˜์ชฝ์œผ๋กœ ํ•ฉ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค์ƒ dp๋ฐฐ์—ด์ธ square๋ฐฐ์—ด์— ์ •์‚ฌ๊ฐํ˜• ์˜ค๋ฅธ์ชฝ์•„๋ž˜ ์ธ๋ฑ์Šค๋ฅผ ๋‘๊ณ  ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋ฉฐ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ–ˆ๋‹ค.
    • arr ๋ฐฐ์—ด ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ๋Š” ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋„˜์–ด๊ฐ”๋‹ค.
    • ๊ฐ€๋กœ ์„ธ๋กœ ์—ฐ์†๊ฐ’ ์ค‘ ์ž‘์€ ๊ฐ’(min)์„ ๊ณจ๋ผ ์ •์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•œ๋‹ค.
    • square ๋ฐฐ์—ด์—์„œ ์ขŒ์ƒ๋‹จ ์ธ๋ฑ์Šค๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ •์‚ฌ๊ฐํ˜•์˜ ๋‚ด๋ถ€๊ฐ€ 1๋กœ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. min๊ฐ’์œผ๋กœ ๋ฐ”๋กœ ์œ—์ชฝ๊ณผ ์™ผ์ชฝ์€ 1์ด ์ฐจ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ขŒ์ƒ๋‹จ ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์žˆ์œผ๋ฉด ์ •์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋•Œ, ์ขŒ์ƒ๋‹จ ์ธ๋ฑ์Šค์˜ ๊ฐ’์ด min - 1๋ณด๋‹ค ์ž‘์œผ๋ฉด min ๋ณด๋‹ค ์ž‘์€ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๊ทธ๋ ค์ง€๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.
      ์ขŒ์ƒ๋‹จ ์ธ๋ฑ์Šค ๊ฐ’ + 1์ด min ์ดํ•˜์ด๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ ์ •์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.
    • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋‘ ํ•ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด square์— 1์„ ์ €์žฅํ•œ๋‹ค.
  • square์— ์ €์žฅ๋œ ๊ฐ’ ์ค‘ ์ตœ๋Œ€๊ฐ’์˜ ์ œ๊ณฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ”ธ ์ ํ™”์‹ ๊ฐœ์„  ํ’€์ด ์ฝ”๋“œ ๐Ÿ”ธ

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

public class Main {
    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[][] arr = new int[n][m];
        int[][] dp = new int[n][m];

        for (int i = 0; i < n; i++) {
            char[] chars = br.readLine().toCharArray();
            for (int j = 0; j < m; j++) {
                arr[i][j] = Character.getNumericValue(chars[j]);
            }
        }

        int max = 0; // ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ ์—ด์„ ๊ณ ๋ คํ•˜์—ฌ max ์ดˆ๊ธฐํ™”๋ฅผ 0์œผ๋กœ ์„ค์ •

        // copy first col and check max
        for (int i = 0; i < n; i++) {
            dp[i][0] = arr[i][0];
            max = Math.max(max, dp[i][0]); // ์ฒซ ๋ฒˆ์งธ ์—ด์— ๋Œ€ํ•œ ์ตœ๋Œ€๊ฐ’ ํ™•์ธ
        }
        // copy first row and check max
        for (int j = 0; j < m; j++) {
            dp[0][j] = arr[0][j];
            max = Math.max(max, dp[0][j]); // ์ฒซ ๋ฒˆ์งธ ํ–‰์— ๋Œ€ํ•œ ์ตœ๋Œ€๊ฐ’ ํ™•์ธ
        }


        // DP
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (arr[i][j] == 0)
                    continue;
                dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                max = Math.max(max, dp[i][j]);
            }
        }

        // Output
        bw.write(Integer.toString(max * max));
        bw.flush();
    }
}

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

  • ๊น”๋”ํ•˜๊ฒŒ DP ์ ํ™”์‹์ด ๋‚˜์˜จ ํ’€์ด์ด๋‹ค.
    • dp๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ •์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ ์ธ๋ฑ์Šค๋กœ ๋ณด๊ณ , ์œ„ ํ’€์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
    • ์ ํ™”์‹์€ min(์™ผ์ชฝ, ์œ„์ชฝ, ์ขŒ์ƒ๋‹จ) + 1 ์ด๋‹ค.
  • dp๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ธฐ ์ „์— ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์—ด๊ณผ ํ–‰์€ ๊ธฐ์กด ์ž…๋ ฅ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ์ดˆ๊ธฐ๊ฐ’๊ณผ dp๋ฐฐ์—ด ๊ณ„์‚ฐ ์‹œ ์ตœ๋Œ€๊ฐ’ ํ™•์ธํ•ด์„œ ์ œ๊ณฑ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  •  ์ œํ•œ ์‹œ๊ฐ„ 1์ดˆ์ธ๊ฑธ ๋ณด๊ณ , ๋ฐ”๋กœ dp๋ฌธ์ œ์ธ๊ฑธ ๋ˆˆ์น˜์ฑ˜๋‹ค. ํ•˜์ง€๋งŒ ์ ํ™”์‹ ๋„์ถœ์ด ์–ด๋ ค์›Œ์„œ ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ•ฉ๋ฐฐ์—ด์„ ๊ทธ๋ ค๋ณด๊ฑฐ๋‚˜ ํ•˜๋ฉด์„œ ๊ทœ์น™์„ ์ฐพ๊ณ ์ž ํ–ˆ๋‹ค.
  • ๊ฒฐ๊ตญ ํ’€์–ด๋Š” ๋ƒˆ๋Š”๋ฐ, ํšจ์œจ์ด ์ข‹์ง€ ์•Š์•„์„œ GPT๋ฅผ ํ†ตํ•ด ์ ํ™”์‹์„ ๋‹ค์‹œ ๋„์ถœํ•ด์„œ ์กฐ๊ธˆ ๋” ํšจ์œจ ์ข‹๊ฒŒ ์žฌํ’€์ดํ–ˆ๋‹ค.
  • ์žฌํ’€์ด ๊ณผ์ •์—์„œ ์ฒซ ํ–‰๊ณผ ์—ด์— ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ๋Š” ๋ฐ˜๋ณต๋ฌธ์—๋„ ์ตœ๋Œ€๊ฐ’ ๋„์ถœ์ด ํ•„์š”ํ–ˆ์–ด์„œ ํ•œ๋ฒˆ ํ‹€๋ ธ๋‹ค.
728x90