๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด

[SWEA-2001] ํŒŒ๋ฆฌ ํ‡ด์น˜

by alswlfl 2026. 6. 23.

[๋ˆ„์ ํ•ฉ]-ํŒŒ๋ฆฌํ‡ด์น˜

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com

 

๋ฌธ์ œ ์„ค๋ช…

NxN ๋ฐฐ์—ด ์•ˆ์— ํ•ด๋‹น ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ํŒŒ๋ฆฌ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์กด์žฌํ•จ.

์ด๋•Œ, MxM ํฌ๊ธฐ์˜ ํŒŒ๋ฆฌ์ฑ„๋ฅผ ํ•œ ๋ฒˆ ๋‚ด๋ฆฌ์ณ ์ตœ๋Œ€ํ•œ ํŒŒ๋ฆฌ๋ฅผ ์ฃฝ์ด๊ณ ์ž ํ•  ๋•Œ ์ฃฝ์€ ํŒŒ๋ฆฌ์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

์ œ์•ฝ ์‚ฌํ•ญ

  • N์€ 5 ์ด์ƒ 15 ์ดํ•˜
  • M์€ 2 ์ด์ƒ N ์ดํ•˜
  • ๊ฐ ์˜์—ญ์˜ ํŒŒ๋ฆฌ ๊ฐœ์ˆ˜๋Š” 30 ์ดํ•˜

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

N M arr result
5 2 [[1, 3, 3, 6, 7],
[8, 13, 9, 12, 8],
[4, 16, 11, 12, 6],
[2, 4, 1, 23, 2],
[9, 13, 4, 7, 3]]
49

 

์ •๋‹ต ์˜ˆ์‹œ

ํ’€์ด ๋ฐฉ๋ฒ•

2์ฐจ์› ๋ฐฐ์—ด ๋ˆ„์ ํ•ฉ ์ด์šฉ

 

1. 2์ฐจ์› ๋ฐฐ์—ด ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ

  0 1 2 3 4
0 1 4 7 13 20
1 9 25 37 55 70
2 13 45 68 98 119
3 15 51 75 28 151
4 24 73 101 161 187

 

  • 0ํ–‰ → DP[0][c] = DP[0][c-1]+arr[0][c]
  • 0์—ด  → DP[r][0] = DP[r-1][0]+arr[r][0]
  • ๋‚˜๋จธ์ง€ → DP[r][c] = DP[r-1][c] + DP[r][c-1] - DP[r-1][c-1] + arr[r][c]

2. MxM ํฌ๊ธฐ์˜ ๋ถ€๋ถ„ํ•ฉ ๊ตฌํ•˜๊ธฐ

  0 1 2 3 4
0 1 4 7 13 20
1 9 25 28 30 33
2 13 41 49 44 38
3 15 .. .. .. ..
4 24 .. .. .. ..
  • r >= M-1 && c >= M-1 ์ธ ๊ฒฝ์šฐ๋งŒ ๋ถ€๋ถ„ํ•ฉ ๊ตฌํ•˜๊ธฐ
  • ์ดˆ๊ธฐ max ๊ฐ’ = DP[M-1][M-1] = 25
  • r-M < 0์ธ ๊ฒฝ์šฐ → DP[r][c] - DP[r][c-M]
  • c-M < 0์ธ ๊ฒฝ์šฐ → DP[r][c] - DP[r-M][c]
  • ๋‚˜๋จธ์ง€ → DP[r][c] - DP[r-M][c] - DP[r][c-M] + DP[r-M][c-M]

์ฝ”๋“œ

import java.util.*;
import java.io.*;
import java.lang.*;

class Solution
{
	public static void main(String args[]) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine()); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜

        StringBuilder sb = new StringBuilder();
		for(int test_case = 1; test_case <= T; test_case++)
		{
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken()); // NxN ๋ฐฐ์—ด ํฌ๊ธฐ
            int M = Integer.parseInt(st.nextToken()); // ํŒŒ๋ฆฌ์ฑ„ ํฌ๊ธฐ
            
            int[][] arr = new int[N][N];
            // ๋ฐฐ์—ด ์ฑ„์šฐ๊ธฐ
            for(int r=0; r<N; r++){
            	st = new StringTokenizer(br.readLine());
                int c = 0;
                while(st.hasMoreTokens()){
                	arr[r][c++] = Integer.parseInt(st.nextToken());
                }
            }
            
            int[][] dp = new int[N][N]; // ๋ˆ„์ ํ•ฉ
            dp[0][0] = arr[0][0]; // 0ํ–‰ 0์—ด ๊ฐ’ ์„ค์ •
            // 0ํ–‰ ๋ˆ„์ ํ•ฉ
            for(int c=1; c<N; c++) dp[0][c] = dp[0][c-1] + arr[0][c];
            // 0์—ด ๋ˆ„์ ํ•ฉ
            for(int r=1; r<N; r++) dp[r][0] = dp[r-1][0] + arr[r][0];
            // ๋‚˜๋จธ์ง€ ๋ˆ„์ ํ•ฉ
            for(int r=1; r<N; r++){
            	for(int c=1; c<N; c++) {
                	dp[r][c] = dp[r-1][c] + dp[r][c-1] - dp[r-1][c-1] + arr[r][c];
                }
            }

			// MxM ํฌ๊ธฐ๋งŒํผ ๋ถ€๋ถ„ํ•ฉ ๊ตฌํ•˜๊ธฐ
            int max = dp[M-1][M-1]; // ์ดˆ๊ธฐ ์ตœ๋Œ“๊ฐ’ ์„ค์ •
            for(int r=M-1; r<N; r++) {
            	for(int c=M-1; c<N; c++) {
                    int part_sum = 0; // ๋ถ€๋ถ„ํ•ฉ
                	if(r==M-1 && c==M-1) continue;
                    else if(r-M < 0) {
                    	part_sum = dp[r][c] - dp[r][c-M];
                    }else if(c-M < 0) {
                    	part_sum = dp[r][c] - dp[r-M][c];
                    }else {
                    	part_sum = dp[r][c] - dp[r-M][c] - dp[r][c-M] + dp[r-M][c-M];
                    }
                    max = Math.max(max, part_sum); // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
                }
            }
            sb.append(String.format("#%d %d\n", test_case, max));
		}
        System.out.println(sb);
	}
}