[BOJ][๐ก4][๋ฐฑ์ค#01915] ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
nรm์ 0, 1๋ก ๋ ๋ฐฐ์ด์ด ์๋ค. ์ด ๋ฐฐ์ด์์ 1๋ก ๋ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
0 1 0 0
0 1 1 1
1 1 1 0
0 0 1 0
์์ ๊ฐ์ ์์ ์์๋ ๊ฐ์ด๋ฐ์ 2ร2 ๋ฐฐ์ด์ด ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ด๋ค.ย
์ ๋ ฅ
์ฒซ์งธ ์ค์ n, m(1 โค n, m โค 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ m๊ฐ์ ์ซ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
4 4
0100
0111
1110
0010
์ถ๋ ฅ
4
My Sol
I, J = map(int, input().split())
mat = [list(map(int, input())) for _ in range(I)]
# ๊ฐ๋ก ์ฐ์ 1
h_mat = [[0]*J for _ in range(I)]
for i in range(I):
h_mat[i][0] = mat[i][0]
for i in range(I):
for j in range(1, J):
if not mat[i][j]: continue
h_mat[i][j] = h_mat[i][j-1]+1
# ์ธ๋ก ์ฐ์ 1
v_mat = [[0]*J for _ in range(I)]
for j in range(J):
v_mat[0][j] = mat[0][j]
for i in range(1, I):
for j in range(J):
if not mat[i][j]: continue
v_mat[i][j] = v_mat[i-1][j]+1
dp = [[0]*(J+1) for _ in range(I+1)]
for i in range(1, I+1):
for j in range(1, J+1):
if not mat[i-1][j-1]: continue
l = dp[i-1][j-1]
if not l:
dp[i][j] = 1
continue
if v_mat[i-1][j-1] > l and h_mat[i-1][j-1] > l:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = min(v_mat[i-1][j-1], h_mat[i-1][j-1], l+1)
maxx = 0
for i in range(I+1):
for j in range(J+1):
if maxx < dp[i][j]:
maxx = dp[i][j]
print(maxx**2)
DP๋ฅผ ์ด์ฉํ์ฌ ํ ์ ์๋ ๋ฌธ์ ์๋ค. ๋ฌธ์ ํ์ด์ ํต์ฌ์ ์ด๋ ํฌ์ธํธ์์ ์ต๋ ํฌ๊ธฐ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๋ค๋ฉด, ๊ทธ ๋ค์ ํ๊ณผ ๊ทธ ๋ค์ ์ด์ด ๊ณ์ 1์ด์ด์ผ ์ค๋ฅธ์ชฝ ๋๊ฐ์ ์๋์ 1์ด ๋ ์ฆ๊ฐํ ์ ์ฌ๊ฐํ์ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋กํ ์ ์๋ค๋ ์ ์ด๊ณ , ๋ง์ฝ ํ๊ณผ ์ด์์ ์ค๊ฐ์ ์๋ฆฐ๋ค๋ฉด ์๋ฆฐ ํฌ์ธํธ๊น์ง์ ๊ธธ์ด ์ค ๊ฐ์ฅ ์งง์ ๊ฒ์ด ์๋ก์ด ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ๋ณ์ ๊ธธ์ด๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค.
- ํ๊ณผ ์ด์์ ์ฐ์๋ 1์ ์ฒดํฌํ๋ h_mat๊ณผ v_mat์ ๋ง๋ค์ด์ค๋ค.
- ํ ํฌ์ธํธ์ ์ต๋ ์ ์ฌ๊ฐํ์ ๋ณ์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ dp 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ์ด๋ฅผ ์์ ์ค๋ช ์ ๋ง๊ฒ ๋ก์ง์ ๊ตฌ์ฑํ๋ค.
- dp 2์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ์๋ฅผ ํ์ธํ๋ค. ์ด๋ ํด๋น ํฌ์ธํธ์์ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ๋ณ์ ๊ธธ์ด์ด๋ฏ๋ก ์ด๋ฅผ ์ ๊ณฑํ์ฌ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
input = sys.stdin.readline
n, m = map(int,input().split())
arr = []
for i in range(n):
now = list(map(int, input().rstrip()))
arr.append(now)
for i in range(1,n):
for j in range(1,m):
if arr[i][j] == 1:
arr[i][j] = min(arr[i-1][j-1], arr[i][j-1], arr[i-1][j]) +1
answer = 0
for i in arr:
answer = max(answer, max(i))
print(answer**2)
๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ฐ์๊ฐ์ด ์ ๋ฐ์ ๋ ๋๋ ํ์ด๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ์ฐ์ stdin.readline์ ์ด์ฉํด์ ์ ๋ ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ์๋ค. ์ด ๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ ValueError๊ฐ ๋ฐ์ํด์ ๋๋ ์ ๊ฑฐํด์ฃผ์๋ค. DP๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋๋ฐ, ํ ํฌ์ธํธ์ ์์ชฝ, ์ผ์ชฝ, ์ผ์ชฝ ์ ๋๊ฐ์ ์ dp ๊ฐ ์ค ์ต์๊ฐ์ 1์ ๋ํ ๊ฐ์ dp์ ์ ์ฅํด์ฃผ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ