최대 1 분 소요

swea 1216 회문2

사용언어 : PYTHON

풀이

시간복잡도를 줄이기 위해 길이가 1인 문장부터 오름차순으로 100까지 검사하는 것이 아닌

100부터 내림차순으로 검사를 해야한다.

내림차순으로 검사를 수행하다가 그 문장이 회문이 맞다면 가장 긴 회문이 되기 때문이다.

행 방향으로 가장 긴 회문의 길이와 열 방향으로 가장 긴 회문의 길이 중 더 큰 값이 정답이 된다.

총 세 개의 함수를 이용하였다.

  • 회문인지 확인하는 check함수

  • 행 방향으로 탐색하는 find_row함수

  • 열 방향으로 탐색하는 find_col함수 (함수 안에서 find_row를 호출하고 크기를 비교한 뒤 최종 정답을 return함)

코드


def check(st):

    for i in range(len(st)//2):
        if st[i]!=st[len(st)-1-i]:
            return False

    return True

def find_row():

    answer=1

    for p in range(100,0,-1):
        for q in range(0,101-p):
            for r in range(0,100):
                st=l[r][q:q+p]
                if check(st): # 회문이 맞다면 가장 긴 회문이 되므로 return을 수행
                    answer=len(st)
                    return answer
            
                    
def find_col():
    transpose_l=list(zip(*l)) # 열 방향으로 탐색하기 위해 전치행렬을 구함

    answer=find_row()

    for p in range(100,0,-1):
        for q in range(0,101-p):
            for r in range(0,100):
                st=transpose_l[r][q:q+p]
                if check(st):
                    if len(st)>answer:
                        answer=len(st)
                    return answer


for _ in range(10):

    N=int(input())
    l=[list(input()) for _ in range(100)]
    

    print('#{} {}'.format(N,find_col()))

image

댓글남기기