https://www.acmicpc.net/problem/1051
1051번: 숫자 정사각형
N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는
www.acmicpc.net
<접근>
원하는 정사각형의 조건은 같은 행, 같은 열에 존재한다. 한 노드를 기준으로 같은 줄의 같은 숫자를 찾아서 해당 거리를 구하고, 그 거리만큼 떨어진 사각형의 위치에 같은 숫자가 존재하는지를 판단하면 된다.
<입력>
N, M = map(int, input().split())
square = []
for _ in range(N):
square.append(list(map(int, input())))
N행 M열을 입력받는다.
사각형을 입력받아 square에 저장한다.
<같은 수 찾기>
foursquare = 1
for row in range(N-1):
for col in range(M-1):
num = square[row][col]
for next_col in range(col+1, M):
if num == square[row][next_col]:
gap = next_col-col
가장 큰 정사각형의 한 변의 크기를 담을 변수 foursquare를 선언한다. 1로 초기화한 이유는 아래의 코드는 원하는 두 지점을 찾는 것인데, 두 지점이 존재하지 않는 경우 1개가 가장 큰 정사각형이므로 1로 초기화한다.
N-1과 M-1만큼 탐색하는 이유는 아래의 코드는 두 지점을 찾는 것이므로 오른쪽과 아래쪽 하나씩 남겨둔다.
한 수를 기준으로 num에 저장하여 비교해준다. 같은 줄에 있는 다음 수부터 비교하여 같은 수가 나오면 해당 수와 기준 수와의 차이를 gap에 저장해둔다.
<비교하기>
if row+gap < N:
if num == square[row+gap][col] and num == square[row+gap][next_col]:
if gap+1 > foursquare:
foursquare = gap+1
print(foursquare**2)
길이 gap과 row를 더했을 때 범위를 넘어가면 에러가 나므로 더 작은 경우만 비교해준다.
나머지 두 점을 비교하여 nu과 같으면 해당 지점은 정사각형이므로 gap과 foursquare를 비교하여 gap이 더 크다면 갱신해준다. 해당 점도 길이에 포함되므로 1을 더해준다.
<전체 코드>
N, M = map(int, input().split())
square = []
for _ in range(N):
square.append(list(map(int, input())))
foursquare = 1
for row in range(N-1):
for col in range(M-1):
num = square[row][col]
for next_col in range(col+1, M):
if num == square[row][next_col]:
gap = next_col-col
if row+gap < N:
if num == square[row+gap][col] and num == square[row+gap][next_col]:
if gap+1 > foursquare:
foursquare = gap+1
print(foursquare**2)
'# Coding > # 백준' 카테고리의 다른 글
[백준 / 1371] 가장 많은 글자 - Python (0) | 2021.04.05 |
---|---|
[백준 / 1526] 가장 큰 금민수 - Python (0) | 2021.04.05 |
[백준 / 1350] 진짜 공간 - Python (0) | 2021.04.02 |
[백준 / 1389] 케빈 베이컨의 6단계 법칙 - Python (0) | 2021.04.02 |
[백준 / 1422] 숫자의 신 - Python (0) | 2021.04.02 |