우석SONG 2022. 1. 15. 05:33

처음에 내가 푼 방법 :

import sys
n,m = map(int,sys.stdin.readline().split())
data=[input() for _ in range(n)]
result =[1]
for k in range(1,min(n,m)):
  for i in range(n):
    for j in range(m):
      if i+k<n and j+k<m :
        if data[i][j]==data[i+k][j]==data[i][j+k]==data[i+k][j+k] :
          result.append((k+1)**2)
print(max(result))

위의 코드로 정답을 맞추긴 했다. 하지만 나는 굳이 작은 정사각형 부터 찾아서 result라는 list에 다 append 한 후에 마지막에 result중 max값을 print하게 했다. 

 

하지만 k의 범위를 1~min(n,m)으로 하지 않고 반대로 min(n,m)~1로 하면 큰 정사각형 부터 찾을 수 있고 바로 반복문을 빠저 나오면 된다. 그러면 따로 result라는 list를 만들지 않아도 되는 장점도 있다. 밑의 코드를 참고하시오. 

 

import sys
n,m = map(int,sys.stdin.readline().split())
data=[input() for _ in range(n)]
result=1
breaker =True
for k in range(min(n,m),0,-1):
  for i in range(n):
    for j in range(m):
      if i+k<n and j+k<m :
        if data[i][j]==data[i+k][j]==data[i][j+k]==data[i+k][j+k] :
          result=(k+1)**2
          breaker = False
          break
    if breaker == False:
      break
  if breaker == False:
    break          
print(result)

위의 코드로 주목할 점은 

첫번째로 k의 범위가 min(n,m) 에서 1까지 -1주기로 감소한다는 것!

두번째로 break는 for문 하나만 빠저나올 수 있기 때문에 breaker라는 변수를 사용해서 중첩 for문을 빠저나오는 방법이다!