PS/코드트리
[코드트리 챌린지] 3주차 - 양수 직사각형의 최대 크기
행복한라이언
2023. 9. 20. 15:45
728x90
반응형
·문제링크
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
·핵심
1. 시간복잡도 : O(nm * nm * nm) = O((nm)^3)
→ board의 모든 좌표 판단 : n * m
→ 가능한 사각형의 모든 모양 : n * m
→ 만들어진 직사각형 안의 격자들이 격자 내부에 존재하며 양수인지 판단 : n * m
2. retangles : 가능한 사각형의 모든 모양 기록
# 가능한 사각형의 모든 모양 기록
retangles = []
for r in range(1, n + 1):
for c in range(1, m + 1):
retangles.append((r, c))
3. 양수 직사각형 판단 : 조건을 만족하는 격자의 수와 직사각형의 넓이 같다면 양수 직사각형
# 격자의 수와 넓이가 같으면 양수 직사각형이다.
if cnt == dr * dc:
ans = max(ans, dr * dc)
·코드(Python)
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
# 격자 내 범위 체크
def in_range(r, c):
return 0 <= r < n and 0 <= c < m
# 가능한 사각형의 모든 모양 기록
retangles = []
for r in range(1, n + 1):
for c in range(1, m + 1):
retangles.append((r, c))
# 시간복잡도 : O(nm * nm * nm) = O((nm)^3)
# 20^6 = 2^6 * 10^6 = 64 * 1000000 = 64,000,000
# 양수직사각형이 없을 경우 -1 출력
ans = -1
for r in range(n):
for c in range(m):
for dr, dc in retangles:
# 새로운 사각형 만들어질 때마다 cnt 초기화
cnt = 0
for i in range(r, r + dr):
for j in range(c, c + dc):
if in_range(i, j) and board[i][j] > 0:
cnt += 1
# 격자의 수와 넓이가 같으면 양수 직사각형이다.
if cnt == dr * dc:
ans = max(ans, dr * dc)
print(ans)
728x90
반응형