๐๋ฌธ์ ํ์ํ๊ธฐ
- 0๊ณผ 1๋ก ์ฑ์์ง ์ด์ง ์ด์ฐจ์ ํ๋ ฌ ํํ matrix
- ์ค๋ก์ง 1๋ง ํฌํจํ๋ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ์ฐพ์ ๋์ด ๊ตฌํ๊ธฐ
๋งค๊ฐ๋ณ์
- n x m ํฌ๊ธฐ์ ๋ฐ์ด๋๋ฆฌ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง 2์ฐจ์ ๋ฆฌ์คํธ matrix
- 1 ≤ n, m ≤ 200
๋ฐํ๊ฐ
- ์ฃผ์ด์ง matrix์์ 1๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ๋ฐํ
ํ์ด ๋ฐฉ๋ฒ ์๊ฐํด๋ณด๊ธฐ
์ฃผ์ด์ง matrix์์ ๊ฐ ์ด์ ๊ฐ์ด ๋์ ๋ ๋์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ์ฆ, ํ ํ์ฉ ํ์ํ๋ฉด์ ๊ฐ ์ด์ ๊ฐ์ด 1์ด๋ฉด ์ด์ ๊น์ง ์์ธ ๋์ด์ 1์ ๋์ ์ํค๊ณ , 0์ด๋ผ๋ฉด ํด๋น ์ด์ ๋์ด๋ฅผ ์ด๊ธฐํํด์ ๊ฐ ํ์ ํ์คํ ๊ทธ๋จ์ฒ๋ผ ํํํ ์ ์๋ค. ๊ฒฐ๊ตญ ์ด ๋ฌธ์ ๋ ๊ฐ ํ์ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ณํํ์ฌ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ๊ฐ ์ด๋ง๋ค์ ์ต๋ ๋์ด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด heights๋ฅผ ์์ฑํด ๋ชจ๋ ์์๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ํ์ฌ๊น์ง์ ์ต๋ ํฌ๊ธฐ ์ง์ฌ๊ฐํ ๋์ด๋ฅผ ์ ์ฅํ ๋ณ์ max_area๋ฅผ ์์ฑํด 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- matrix์ ๊ฐ ํ์ ํ ์ค์ฉ ํ์ํ๋ฉฐ ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ํด๋น ํ์ ํ ์นธ์ฉ ํ์ํ๋ฉฐ ๊ฐ์ด 1์ด๋ฉด height, ํด๋น ์ด์ ๋์ด๋ฅผ ๊ฐฑ์ ํ๋ค. ๊ฐ์ด 0์ด๋ฉด ํด๋น ์ด์ ๋์ด๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ๋ชจ๋ ์นธ์ ๋ํ ํ์์ด ๋๋๋ฉด ์ต๋ ๋์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด stack ๋ฆฌ์คํธ๋ฅผ ์์ฑํด ์ด๊ธฐ ์ธ๋ฑ์ค -1๋ฅผ ์ฝ์ ํ๋ค.
- ๊ฐ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ๋ฉฐ, ํ์ฌ ๋์ด๊ฐ ์ด์ ๋ณด๋ค ๋ฎ์์ง๋ ๋์ ์คํ์์ ์ธ๋ฑ์ค๋ฅผ ๊บผ๋ด ๋์ด๋ฅผ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ธ๋ฑ์ค์ ์คํ์ ์ต์๋จ์ ์์นํ ์ธ๋ฑ์ค ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋๋น๋ก ์ ์ฅํด ์ต๋ ๋ฉด์ ์ ๊ฐฑ์ ํ๋ค. ๋ชจ๋ ๋น๊ต๊ฐ ๋๋๋ฉด ์คํ์ ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ฝ์ ํ ๋ค์ ์ธ๋ฑ์ค๋ก ๋์ด๊ฐ๋ค.
- max_area๋ฅผ ๋ฐํํ๋ค.
๐์ ๋ต ์ฝ๋
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix:
return 0
n_cols = len(matrix[0])
heights = [0] * (n_cols + 1)
max_area = 0
for row in matrix:
for col in range(n_cols):
heights[col] = heights[col] + 1 if row[col] == "1" else 0
stack = [-1]
for i in range(n_cols + 1):
while heights[i] < heights[stack[-1]]:
h = heights[stack.pop()]
w = i - stack[-1] - 1
max_area = max(max_area, h * w)
stack.append(i)
return max_area
728x90