SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
1️⃣ 문제 개요
- N × N 크기의 정수 배열이 주어짐.
- 같은 숫자로 이루어진 가장 큰 직사각형을 찾고, 해당 직사각형의 개수를 계산해야 함.
2️⃣ 코드 설명
import sys
sys.stdin = open('Solve.txt')
input = sys.stdin.readline
T = int(input())
for t in range(1, T+1):
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
max_Area = 0
count = 0
# 최대 직사각형의 넓이 찾기
for y in range(N):
for x in range(N):
for dy in range(0, N-y):
for dx in range(0, N-x):
if board[y][x] == board[y+dy][x+dx]:
Area = (dy+1) * (dx+1)
if Area > max_Area:
max_Area = Area
# 최대 넓이를 가진 직사각형 개수 세기
for y in range(N):
for x in range(N):
for dy in range(0, N-y):
for dx in range(0, N-x):
if board[y][x] == board[y+dy][x+dx]:
Area = (dy+1) * (dx+1)
if Area == max_Area:
count += 1
print(f'#{t}', count)
3️⃣ 코드 동작 과정
- 입력 처리
- 여러 개의 테스트 케이스를 처리하기 위해 T를 입력받음.
- N × N 크기의 배열을 입력받아 board 리스트에 저장.
- 최대 면적 찾기
- (y, x) 위치에서 시작하여 가능한 모든 (dy, dx) 크기의 직사각형을 탐색.
- 직사각형의 대각선 (y+dy, x+dx) 위치의 값이 동일한 경우만 면적을 계산하여 max_Area 갱신.
- 최대 면적을 가진 직사각형 개수 세기
- 다시 같은 방식으로 탐색하며 max_Area와 동일한 면적을 가지는 직사각형을 세어 count 변수에 저장.
- 부분집합 탐색과의 연관성
- 이 문제의 접근 방식은 부분집합을 생성하는 방법과 유사합니다.
- (y, x)에서 시작하는 모든 가능한 직사각형의 조합을 탐색하므로, 완전 탐색을 통한 부분집합 탐색 기법이 적용됨.
- 부분집합 탐색은 모든 경우를 고려하는 방식이며, 이 문제에서는 모든 직사각형의 가능성을 탐색하는 점에서 유사함.
4️⃣ 이 문제를 풀기 위해 반드시 알아야 할 개념
- 브루트 포스(완전 탐색): 모든 가능한 경우를 하나하나 탐색하는 기법.
- 2차원 배열 탐색: for 문을 중첩하여 행렬을 순회하는 방법.
- 중첩 반복문: 가능한 모든 직사각형을 찾기 위해 4중 반복문을 사용.
- 부분집합 탐색(Subset Search): 가능한 모든 선택을 고려하는 방식으로, 이 문제에서 직사각형 탐색과 유사하게 적용됨.
- 조건문 활용: 특정 조건 (board[y][x] == board[y+dy][x+dx])을 만족하는 경우만 진행.
📌 이 코드는 완전 탐색 방식이므로 O(N^4)의 시간 복잡도를 가집니다. N이 클 경우 더 효율적인 알고리즘이 필요할 수 있습니다.
'Baekjoon' 카테고리의 다른 글
2164. 카드 2 (0) | 2025.02.19 |
---|---|
18258. 큐 2 (0) | 2025.02.19 |
1157. 단어 공부 (0) | 2025.02.19 |
4949. 균형 잡힌 세상 (0) | 2025.02.14 |
1018. 체스판 다시 칠하기 (0) | 2025.02.13 |