๐Ÿ’ซ ETC/Problem Solving

[SWEA] 2001. ํŒŒ๋ฆฌ ํ‡ด์น˜ (DP)

ming412 2023. 11. 9. 13:18

โœ๏ธ ๋ฌธ์ œ ์š”์•ฝ

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PzOCKAigDFAUq&categoryId=AV5PzOCKAigDFAUq&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

 

N x N ๋ฐฐ์—ด ์•ˆ์˜ ์ˆซ์ž๋Š” ํ•ด๋‹น ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ํŒŒ๋ฆฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

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

 

๐Ÿ’ช ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ (๋ฐ˜๋ณต๋ฌธ)

์ •์‚ฌ๊ฐํ˜•์˜ ์‹œ์ž‘ ์ ์„ (i, j)๋กœ ๋‘๊ณ  ๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

๋ฌด๋ ค 4์ค‘ for๋ฌธ์ด๋‹ค..๐Ÿ˜ฑ ๋ฌธ์ œ์—์„œ N ์€ 5 ์ด์ƒ 15 ์ดํ•˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ฆฌ ์—†์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ†ต๊ณผํ•œ๋‹ค.

import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

# ๋ณด๋“œ(B)์—์„œ (x, y)๋ถ€ํ„ฐ ํ•œ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ size์ธ ์ •์‚ฌ๊ฐํ˜• ํ•ฉ
def calc(B, x, y, sz):
    tot = 0
    for i in range(x, x+sz):
        for j in range(y, y+sz):
            tot += B[i][j]
    return tot

if __name__ == '__main__':
    T = int(input())
    for test_case in range(1, T + 1):
        N, M = map(int, input().split())
        board = [list(map(int, input().split())) for _ in range(N)]

        mx = -1e9
        for i in range(N-M+1):
            for j in range(N-M+1):
                mx = max(mx, calc(board, i, j, M))

        print('#{} {}'.format(test_case, mx))

 

โœจ ์šฐ์•„ํ•˜๊ฒŒ ํ’€๊ธฐ (DP)

N*N๋ฐฐ์—ด์—์„œ, M*M์˜ ๋ถ€๋ถ„ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ตฌ๊ฐ„์„ ์ฐพ๋Š” ๋ฌธ์ œ
๋ถ€๋ถ„ํ•ฉ์€ ๋ญ๋‹ค? DP๋‹ค

1) ๋ถ€๋ถ„ ํ•ฉ(`total`) ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๊ธฐ

 

2) ์ฃผ์–ด์ง„ ๋ฒ”์œ„์—์„œ ์ •์‚ฌ๊ฐํ˜• ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

์ง์‚ฌ๊ฐํ˜• ๋ฐฐ์—ด์—์„œ ์–ด๋А ๋ถ€๋ถ„์ด ์ค‘๋ณต ๊ณ„์‚ฐ๋  ์ง€ ์ฒดํฌํ•˜๋ฉด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ!

O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ์•ˆ์— ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

if __name__ == '__main__':
    T = int(input())
    for test_case in range(1, T + 1):
        N, M = map(int, input().split())
        board = [list(map(int, input().split())) for _ in range(N)]
        tot = [[0] * N for _ in range(N)] # (0,0)~(n,n)์˜ ์ง์‚ฌ๊ฐํ˜• ํ•ฉ์„ ์ €์žฅํ•˜๋Š” total ๋ฆฌ์ŠคํŠธ

	# ๋ถ€๋ถ„ํ•ฉ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๊ธฐ
        for i in range(N):
            for j in range(N):
                tot[i][j] = board[i][j]
                if i>0:
                    tot[i][j] += tot[i-1][j]
                if j>0:
                    tot[i][j] += tot[i][j-1]
                if i>0 and j>0:
                    tot[i][j] -= tot[i-1][j-1]

	# ์ฃผ์–ด์ง„ ๋ฒ”์œ„์—์„œ ์ •์‚ฌ๊ฐํ˜• ํ•ฉ ๊ตฌํ•˜๊ธฐ
        mx = -1e9
        for i in range(N-M+1):
            for j in range(N-M+1):
                # ์ด๋•Œ (i, j)๋Š” ์ •์‚ฌ๊ฐํ˜• ์‹œ์ž‘์ 
                ii, jj = i+M-1, j+M-1 # (ii, jj)๋Š” ์ •์‚ฌ๊ฐํ˜• ๋์ 
                if i==0 and j==0:
                    tmp = tot[ii][jj]
                elif i==0:
                    tmp = tot[ii][jj] - tot[ii][jj-M]
                elif j==0:
                    tmp = tot[ii][jj] - tot[ii-M][jj]
                else:
                    tmp = tot[ii][jj] - tot[ii][jj-M] - tot[ii-M][jj] + tot[ii-M][jj-M]
                mx = max(mx, tmp)

        print('#{} {}'.format(test_case, mx))

 

๐Ÿ”— ์ฐธ๊ณ 

SWEA 2001๋ฒˆ: ํŒŒ๋ฆฌ ํ‡ด์น˜/DP