[Boj_20002] ์‚ฌ๊ณผ๋‚˜๋ฌด

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

20002๋ฒˆ: ์‚ฌ๊ณผ๋‚˜๋ฌด

N × N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘ ๊ณผ์ˆ˜์›์ด ์žˆ๊ณ , N × N ๊ฐœ์˜ ์‚ฌ๊ณผ๋‚˜๋ฌด๊ฐ€ 1 × 1 ํฌ๊ธฐ์˜ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ชจ๋“  ์นธ์— ์‹ฌ์–ด์ ธ์žˆ๋‹ค. ๋†๋ถ€ ํ˜•๊ณค์ด๊ฐ€ ๊ฐ€์„์„ ๋งž์•„ ์‚ฌ๊ณผ๋ฅผ ์ˆ˜ํ™•ํ•˜๋ ค๋Š”๋ฐ, ๋•…์ฃผ์ธ ์‹ ์˜์ด๊ฐ€ "๋„ˆ๋Š” ๊ณผ์ˆ˜์›

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

N × N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘ ๊ณผ์ˆ˜์›์ด ์žˆ๊ณ , N × N ๊ฐœ์˜ ์‚ฌ๊ณผ๋‚˜๋ฌด๊ฐ€ 1 × 1 ํฌ๊ธฐ์˜ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ชจ๋“  ์นธ์— ์‹ฌ์–ด์ ธ์žˆ๋‹ค.

๋†๋ถ€ ํ˜•๊ณค์ด๊ฐ€ ๊ฐ€์„์„ ๋งž์•„ ์‚ฌ๊ณผ๋ฅผ ์ˆ˜ํ™•ํ•˜๋ ค๋Š”๋ฐ, ๋•…์ฃผ์ธ ์‹ ์˜์ด๊ฐ€ "๋„ˆ๋Š” ๊ณผ์ˆ˜์› ๋‚ด์— ์‚ฌ๊ณผ๋‚˜๋ฌด๋ฅผ K × K ์˜ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์œผ๋กœ๋งŒ ์ˆ˜ํ™•ํ•ด ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์–ด, ์ด๋•Œ K๋Š” 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ  N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜๋ผ๊ตฌ! ๋‚˜๋จธ์ง€๋Š” ๋‚ด๊ฐ€ ๋จน์„๊ป˜! ํ•˜ํ•˜!" ๋ผ๊ณ  ํ†ต๋ณดํ–ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์‚ฌ๊ณผ๋‚˜๋ฌด๋ฅผ ์ˆ˜ํ™•ํ•  ๋•Œ, ์‚ฌ๊ณผ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ต๊ณผ ๋…ธ๋™๋น„๋กœ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์†ํ•ด๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค.

๊ทธ๋ž˜์„œ ํ˜•๊ณค์ด๋Š” ๋‚˜๋ฌด์˜ ์œ„์น˜๋ฅผ ์ขŒํ‘œ๋กœ ํ•˜์—ฌ, ์‚ฌ๊ณผ๋ฅผ ํ†ตํ•ด ์–ป์€ ์ด์ต๊ณผ ๋…ธ๋™๋น„๋ฅผ ๋”ํ•œ ์ด์ด์ต์„ 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

์•…๋…ํ•œ ๋•…์ฃผ์ธ ์‹ ์˜์ด๋กœ๋ถ€ํ„ฐ ๊ณ ํ†ต๋ฐ›๋Š” ๊ท€์—ฌ์šด ํ˜•๊ณค์ด์—๊ฒŒ ์ตœ๋Œ€ ์ด์ด์ต์„ ์•ˆ๊ฒจ์ฃผ๊ณ  ์‹ถ์€ ๋‹น์‹ , ํ˜•๊ณค์ด๋ฅผ ๋„์™€์ฃผ์ž!

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ณผ์ˆ˜์›์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 300)

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N + 1๋ฒˆ์งธ ์ค„๊นŒ์ง€, ํ•ด๋‹น ๋‚˜๋ฌด๋ฅผ ์ˆ˜ํ™•ํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ด์ต์„ ํ‘œ์‹œํ•œ๋‹ค.

์ด์ด์ต์€ -1,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 5
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋ˆ„์  ํ•ฉ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ํ•ด๋‹น ๋‚˜๋ฌด๋ฅผ ์ˆ˜ํ™•ํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ด์ต์— ๋Œ€ํ•œ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ๋’ค, ๋ฐฐ์—ด์— ๋ˆ„์ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ €์žฅํ–ˆ๋‹ค.
  • k์˜ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— k๊ฐ€ 1๋ถ€ํ„ฐ n์ผ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ด์ด์ต์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด ์ฃผ์—ˆ๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 21472KB
์‹œ๊ฐ„ : 328ms
import java.io.*;
import java.util.StringTokenizer;

public class Main {
    static int n;
    static int[][] map;
    static int[][] prefix;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        n = Integer.parseInt(br.readLine()); // nxn ๊ณผ์ˆ˜์›์˜ ํฌ๊ธฐ
        map = new int[n+1][n+1]; // ์ด์ด์ต์„ ์ €์žฅํ•  ๋ฐฐ์—ด
        prefix = new int[n+1][n+1]; // ์ด์ด์ต์˜ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด
        StringTokenizer st;
        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= n; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                // 2์ฐจ์› ๋ฐฐ์—ด์˜ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ (์ด์ด์ต์˜ ๋ˆ„์ ํ•ฉ)
                prefix[i][j] = map[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
            }
        }

        int ans = Integer.MIN_VALUE; // ๋ชจ๋“  kxk ํฌ๊ธฐ์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ด์ด์ต์˜ ์ตœ๋Œ“๊ฐ’
        for (int i = 1; i <= n; i++) {
            int tmp = check(i); // 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๊ฐ kxk ํฌ๊ธฐ์— ๋Œ€ํ•œ ์ด์ด์ต ๊ตฌํ•˜๊ธฐ
            ans = Math.max(ans, tmp); // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
        }
        bw.append(ans + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

    private static int check(int k) {
        int max = Integer.MIN_VALUE; // kxk ํฌ๊ธฐ์˜ ์ด์ด์ต์˜ ์ตœ๋Œ“๊ฐ’
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i+k-1 > n || j+k-1 > n) continue; // ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉด ๊ฑด๋„ˆ๋„๊ธฐ
                // kxk ํฌ๊ธฐ์˜ ์ด์ด์ต
                int tmp = prefix[i+k-1][j+k-1] - prefix[i-1][j+k-1] - prefix[i+k-1][j-1] + prefix[i-1][j-1];
                max = Math.max(max, tmp); // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
            }
        }
        return max;
    }
}


 

 

๐Ÿ“ ํ•จ๊ป˜ ํ’€์–ด๋ณด๋ฉด ์ข‹์€ ๋ฐฑ์ค€ ๋ฌธ์ œ